/ Hex Artifact Content
Login

Artifact 7bb920c473c277380fcb3e8a8ee28ce1a48e0abc:


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 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 73 74  Bt->mutex);.}.st
3ba0: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f  atic int cursorO
3bb0: 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75  wnsBtShared(BtCu
3bc0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
3bd0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3be0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
3bf0: 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e  urn (p->pBtree->
3c00: 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b  db==p->pBt->db);
3c10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3c20: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3c30: 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f  overflow cache o
3c40: 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  f the cursor pas
3c50: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
3c60: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e   argument..** on
3c70: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3c80: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3c90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61  .*/.#define inva
3ca0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3cb0: 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d  che(pCur) (pCur-
3cc0: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
3cd0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f  CF_ValidOvfl)../
3ce0: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3cf0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3d00: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3d10: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3d20: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
3d30: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
3d40: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3d60: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
3d70: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
3d80: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3d90: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3da0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3db0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3dc0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3dd0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3de0: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3df0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3e00: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  (p);.  }.}..#ifn
3e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e20: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54  INCRBLOB./*.** T
3e30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3e40: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f  called before mo
3e50: 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
3e60: 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a  ents of a table.
3e70: 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
3e80: 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
3e90: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f  rsors that are o
3ea0: 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f  pen on the.** ro
3eb0: 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  w or one of the 
3ec0: 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66  rows being modif
3ed0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ied..**.** If ar
3ee0: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3ef0: 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ble is true, the
3f00: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  n the entire con
3f10: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
3f20: 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74  table is about t
3f30: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e  o be deleted. In
3f40: 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c   this case inval
3f50: 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c  idate all incrbl
3f60: 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70  ob.** cursors op
3f70: 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69  en on any row wi
3f80: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77  thin the table w
3f90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67  ith root-page pg
3fa0: 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  noRoot..**.** Ot
3fb0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75  herwise, if argu
3fc0: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3fd0: 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  e is false, then
3fe0: 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a   the row with.**
3ff0: 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62   rowid iRow is b
4000: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72  eing replaced or
4010: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
4020: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
4030: 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20  e.** only those 
4040: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
4050: 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70   open on that sp
4060: 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73  ecific row..*/.s
4070: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
4080: 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
4090: 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70  sors(.  Btree *p
40a0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Btree,          
40b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
40c0: 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
40d0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
40e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
40f0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
4100: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
4110: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
4120: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
4130: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
4140: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4150: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4160: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4170: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4180: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4190: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
41a0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
41b0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
41c0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
41d0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
41e0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
41f0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
4200: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4210: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
4220: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
4230: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
4240: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4250: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4260: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c   isClearTable ||
4270: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
4280: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Row ){.        p
4290: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
42a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
42b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
42c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
42d0: 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e  function when IN
42e0: 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65  CRBLOB is omitte
42f0: 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69  d */.  #define i
4300: 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f  nvalidateIncrblo
4310: 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a  bCursors(x,y,z).
4320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4330: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
4340: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74  /../*.** Set bit
4350: 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53   pgno of the BtS
4360: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4370: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69  t bitvec. This i
4380: 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65  s called .** whe
4390: 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72  n a page that pr
43a0: 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e  eviously contain
43b0: 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20  ed data becomes 
43c0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
43d0: 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   .** page..**.**
43e0: 20 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   The BtShared.pH
43f0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4400: 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20   exists to work 
4410: 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72  around an obscur
4420: 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20  e.** bug caused 
4430: 62 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69  by the interacti
4440: 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c  on of two useful
4450: 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IO optimization
4460: 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a  s surrounding.**
4470: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4480: 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  pages:.**.**   1
4490: 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  ) When all data 
44a0: 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
44b0: 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70  a page and the p
44c0: 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20  age becomes.**  
44d0: 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20      a free-list 
44e0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70  leaf page, the p
44f0: 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  age is not writt
4500: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
4510: 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66  se.**      (as f
4520: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4530: 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d  ges contain no m
4540: 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e  eaningful data).
4550: 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20   Sometimes.**   
4560: 20 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69     such a page i
4570: 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e  s not even journ
4580: 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c  alled (as it wil
4590: 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  l not be modifie
45a0: 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62  d,.**      why b
45b0: 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e  other journallin
45c0: 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  g it?)..**.**   
45d0: 32 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c  2) When a free-l
45e0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
45f0: 20 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e   reused, its con
4600: 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64  tent is not read
4610: 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
4620: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72  e database or wr
4630: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4640: 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73  rnal file (why s
4650: 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20  hould it.**     
4660: 20 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f   be, if it is no
4670: 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67  t at all meaning
4680: 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  ful?)..**.** By 
4690: 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73  themselves, thes
46a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
46b0: 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72  work fine and pr
46c0: 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a  ovide a handy.**
46d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
46e0: 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74  st to bulk delet
46f0: 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72  e or insert oper
4700: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
4710: 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73   if.** a page is
4720: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
4730: 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e  ee-list and then
4740: 20 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74   reused within t
4750: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73  he same.** trans
4760: 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65  action, a proble
4770: 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74  m comes up. If t
4780: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a  he page is not j
4790: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a  ournalled when.*
47a0: 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f  * it is moved to
47b0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
47c0: 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f  nd it is also no
47d0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
47e0: 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61  n it.** is extra
47f0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4800: 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73  ee-list and reus
4810: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ed, then the ori
4820: 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61  ginal data.** ma
4830: 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68  y be lost. In th
4840: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
4850: 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f  lback, it may no
4860: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  t be possible.**
4870: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
4880: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
4890: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
48a0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
48b0: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68  e solution is th
48c0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
48d0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57  ontent bitvec. W
48e0: 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69  henever a page i
48f0: 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62  s .** moved to b
4900: 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73  ecome a free-lis
4910: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4920: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4930: 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20  it is.** set in 
4940: 74 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e  the bitvec. When
4950: 65 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65  ever a leaf page
4960: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4970: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4980: 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ,.** optimizatio
4990: 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69  n 2 above is omi
49a0: 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72  tted if the corr
49b0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
49c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
49d0: 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  in BtShared.pHas
49e0: 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e  Content. The con
49f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74  tents of the bit
4a00: 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a  vec are cleared.
4a10: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
4a20: 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69   every transacti
4a30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4a40: 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  t btreeSetHasCon
4a50: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4a60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4a70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4a80: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74  E_OK;.  if( !pBt
4a90: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
4ab0: 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b  o<=pBt->nPage );
4ac0: 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  .    pBt->pHasCo
4ad0: 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  ntent = sqlite3B
4ae0: 69 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d  itvecCreate(pBt-
4af0: 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  >nPage);.    if(
4b00: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4b10: 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
4b20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
4b30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
4b40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4b50: 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74  K && pgno<=sqlit
4b60: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74  e3BitvecSize(pBt
4b70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29  ->pHasContent) )
4b80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
4b90: 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d  e3BitvecSet(pBt-
4ba0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67  >pHasContent, pg
4bb0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
4bc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51  n rc;.}../*.** Q
4bd0: 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65  uery the BtShare
4be0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65  d.pHasContent ve
4bf0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ctor..**.** This
4c00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4c10: 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d  led when a free-
4c20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69  list leaf page i
4c30: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
4c40: 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  he.** free-list 
4c50: 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65  for reuse. It re
4c60: 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69  turns false if i
4c70: 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74  t is safe to ret
4c80: 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67  rieve the.** pag
4c90: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
4ca0: 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
4cb0: 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
4cc0: 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65  g set. True othe
4cd0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
4ce0: 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73   int btreeGetHas
4cf0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d00: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4d10: 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d  ){.  Bitvec *p =
4d20: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4d30: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  t;.  return (p &
4d40: 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42  & (pgno>sqlite3B
4d50: 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20  itvecSize(p) || 
4d60: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
4d70: 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a  t(p, pgno)));.}.
4d80: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65  ./*.** Clear (de
4d90: 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61  stroy) the BtSha
4da0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4db0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f  bitvec. This sho
4dc0: 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65  uld be.** invoke
4dd0: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
4de0: 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74  ion of each writ
4df0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e-transaction..*
4e00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e10: 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
4e20: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4e30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
4e40: 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70  ecDestroy(pBt->p
4e50: 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70  HasContent);.  p
4e60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4e70: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
4e80: 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  lease all of the
4e90: 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20   apPage[] pages 
4ea0: 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
4eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4ec0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
4ed0: 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72  orPages(BtCursor
4ee0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
4ef0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
4f00: 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
4f10: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
4f20: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
4f30: 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  i]);.    pCur->a
4f40: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4f50: 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  }.  pCur->iPage 
4f60: 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  = -1;.}../*.** T
4f70: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
4f80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
4f90: 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74  ument must point
4fa0: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4fb0: 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  y.** when this f
4fc0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4fd0: 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74  d (i.e. have eSt
4fe0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
4ff0: 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  D). This.** func
5000: 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63  tion saves the c
5010: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65  urrent cursor ke
5020: 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70  y in variables p
5030: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a  Cur->nKey and.**
5040: 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c   pCur->pKey. SQL
5050: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5060: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
5070: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
5080: 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  ror .** code oth
5090: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
50a0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
50b0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79  pen on an intkey
50c0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
50d0: 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20   integer key.** 
50e0: 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73  (the rowid) is s
50f0: 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e  tored in pCur->n
5100: 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b  Key and pCur->pK
5110: 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74  ey is left set t
5120: 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68  o.** NULL. If th
5130: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
5140: 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   on a non-intkey
5150: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75   table, then pCu
5160: 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73  r->pKey is .** s
5170: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
5180: 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
5190: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
51a0: 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
51b0: 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79  ning .** the key
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
51d0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74  saveCursorKey(Bt
51e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
51f0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
5200: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5210: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
5220: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
5230: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
5240: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5250: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5260: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5270: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5280: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5290: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
52a0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
52b0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
52c0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
52d0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
52e0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
52f0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
5300: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
5310: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
5320: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
5330: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5340: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5350: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5360: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5370: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5380: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5390: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
53a0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
53b0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
53c0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
53d0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
53e0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
53f0: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43    */.  if( 0==pC
5400: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5410: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
5420: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
5430: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20   pCur->nKey );. 
5440: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
5450: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5460: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
5470: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
5480: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
5490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
54a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
54b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
54c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
54e0: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
54f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5510: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
5520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
5530: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5540: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
5550: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5560: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5570: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5580: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
5590: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
55a0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
55b0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
55c0: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
55d0: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
55e0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
55f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
5600: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
5610: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
5620: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
5630: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
5640: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
5650: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
5660: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
5670: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
5680: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5690: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
56a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
56b0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
56c0: 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52  eState || CURSOR
56d0: 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d  _SKIPNEXT==pCur-
56e0: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
56f0: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
5700: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
5710: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5720: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28  (pCur) );..  if(
5730: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5740: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
5750: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
5760: 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
5770: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
5780: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
5790: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
57a0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70 43  saveCursorKey(pC
57b0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
57c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
57d0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
57e0: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
57f0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5800: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5810: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5820: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
5830: 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
5840: 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
5850: 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a  l|BTCF_AtLast);.
5860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
5890: 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
58a0: 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  NE saveCursorsOn
58b0: 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50  List(BtCursor*,P
58c0: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
58d0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
58e0: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
58f0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
5900: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
5910: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
5920: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
5930: 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22  t-page iRoot.  "
5940: 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f  Saving the curso
5950: 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e  r position" mean
5960: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f  s that.** the lo
5970: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74  cation in the bt
5980: 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65  ree is remembere
5990: 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  d in such a way 
59a0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a  that it can be.*
59b0: 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20  * moved back to 
59c0: 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66  the same spot af
59d0: 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61  ter the btree ha
59e0: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
59f0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
5a00: 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  e is called just
5a10: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70   before cursor p
5a20: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
5a30: 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20  o modify the.** 
5a40: 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70  table, for examp
5a50: 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74  le in BtreeDelet
5a60: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
5a70: 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rt()..**.** If t
5a80: 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
5a90: 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
5aa0: 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
5ab0: 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a  then all such .*
5ac0: 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64  * cursors should
5ad0: 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43 46   have their BTCF
5ae0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5af0: 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43 75  et.  The btreeCu
5b00: 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  rsor().** routin
5b10: 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74 20  e enforces that 
5b20: 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  rule.  This rout
5b30: 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74  ine only needs t
5b40: 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a  o be called in.*
5b50: 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63  * the uncommon c
5b60: 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63 74  ase when pExpect
5b70: 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d 75   has the BTCF_Mu
5b80: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5b90: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65 63  .**.** If pExpec
5ba0: 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e  t!=NULL and if n
5bb0: 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  o other cursors 
5bc0: 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65  are found on the
5bd0: 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c   same root-page,
5be0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54 43  .** then the BTC
5bf0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5c00: 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63 6c  on pExpect is cl
5c10: 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64 20  eared, to avoid 
5c20: 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74  another.** point
5c30: 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68 69  less call to thi
5c40: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
5c50: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5c60: 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74  note:  This rout
5c70: 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b  ine merely check
5c80: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20  s to see if any 
5c90: 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20  cursors.** need 
5ca0: 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74  to be saved.  It
5cb0: 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61   calls out to sa
5cc0: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5cd0: 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61  ) in the (unusua
5ce0: 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74  l).** event that
5cf0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20   cursors are in 
5d00: 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61  need to being sa
5d10: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
5d20: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
5d30: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
5d40: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
5d50: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
5d60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5d70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5d90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5da0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
5db0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5dc0: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5dd0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5de0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5df0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5e00: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5e10: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5e20: 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  Root) ) break;. 
5e30: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65 74   }.  if( p ) ret
5e40: 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73 4f  urn saveCursorsO
5e50: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
5e60: 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28 20  pExcept);.  if( 
5e70: 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65 70  pExcept ) pExcep
5e80: 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  t->curFlags &= ~
5e90: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
5ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5eb0: 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65  K;.}../* This he
5ec0: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20  lper routine to 
5ed0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64  saveAllCursors d
5ee0: 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77  oes the actual w
5ef0: 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a  ork of saving.**
5f00: 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20   the cursors if 
5f10: 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f  and when a curso
5f20: 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  r is found that 
5f30: 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
5f40: 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65  s saving..** The
5f50: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20   common case is 
5f60: 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20  that no cursors 
5f70: 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64  need to be saved
5f80: 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
5f90: 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f  e is.** broken o
5fa0: 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c  ut from its call
5fb0: 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  er to avoid unne
5fc0: 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f  cessary stack po
5fd0: 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a  inter movement..
5fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5ff0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
6000: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
6010: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20  .  BtCursor *p, 
6020: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
6030: 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74  irst cursor that
6040: 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f   needs saving */
6050: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
6070: 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68  save cursor with
6080: 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76   this iRoot. Sav
6090: 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f  e all if zero */
60a0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
60b0: 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  cept    /* Do no
60c0: 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73  t save this curs
60d0: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20  or */.){.  do{. 
60e0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
60f0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
6100: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
6110: 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Root) ){.      i
6120: 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
6130: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
6140: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6150: 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
6160: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
6170: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6180: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
6190: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
61a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
61b0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
61c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
61e0: 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->iPage>0 );.   
61f0: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
6200: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6210: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6220: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
6230: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
6240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6250: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6260: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
6270: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
6280: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6290: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
62a0: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
62b0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
62c0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
62d0: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
62e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
62f0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
6300: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
6310: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6320: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
6330: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
6340: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
6350: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
6360: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
6370: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
6380: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
6390: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
63a0: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
63b0: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
63c0: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
63d0: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
63e0: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
63f0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6400: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
6410: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
6420: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
6430: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
6440: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
6450: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
6460: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
6470: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
6480: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
6490: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
64a0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
64b0: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
64c0: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
64d0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
64e0: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
64f0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
6500: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
6510: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
6520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6530: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
6540: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6550: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6560: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
6570: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
6580: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
6590: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
65a0: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
65b0: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30    char aSpace[20
65c0: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
65d0: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
65e0: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
65f0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  d a malloc */.  
6600: 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b  char *pFree = 0;
6610: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
6620: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
6630: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
6640: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
6650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
6660: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
6670: 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  (.        pCur->
6680: 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65  pKeyInfo, aSpace
6690: 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
66a0: 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a  , &pFree.    );.
66b0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
66c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
66d0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
66e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
66f0: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
6700: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
6710: 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78  nKey, pKey, pIdx
6720: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  Key);.    if( pI
6730: 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30  dxKey->nField==0
6740: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6750: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
6760: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
6770: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
6780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6790: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BKPT;.    }.  }e
67a0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
67b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
67c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
67d0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
67e0: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
67f0: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
6800: 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
6810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6820: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6830: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  b, pFree);.  }. 
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6850: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6860: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6870: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6880: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6890: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
68a0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
68b0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
68c0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
68d0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
68e0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
68f0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
6900: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
6910: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
6920: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
6930: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
6940: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
6950: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6960: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
6970: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
6980: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
6990: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
69a0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
69b0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
69c0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
69d0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
69e0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
69f0: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
6a00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6a10: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
6a20: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6a30: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6a40: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6a50: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6a60: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6a70: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6a80: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6a90: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6aa0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6ab0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6ac0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
6ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
6ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6b70: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6b80: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6b90: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6ba0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6bc0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
6bd0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
6be0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
6bf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6c00: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
6c10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6c20: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6c30: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6c40: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6c50: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6c60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6c70: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6c80: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6c90: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6ca0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6cb0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6cc0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
6cd0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
6ce0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
6cf0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
6d00: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
6d10: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
6d20: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6d30: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6d40: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6d50: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6d60: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6d70: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6d80: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6d90: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6da0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6dc0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
6dd0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
6de0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
6df0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
6e00: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
6e10: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6e20: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6e30: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6e40: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6e50: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6e60: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6e70: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6e80: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6e90: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6ea0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6eb0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6ec0: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
6ed0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
6ee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6ef0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
6f00: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
6f10: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
6f20: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6f30: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6f40: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6f50: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6f60: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6f70: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6f80: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6f90: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6fa0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6fb0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6fc0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
6fd0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
6fe0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
6ff0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
7000: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
7010: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
7020: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
7030: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
7040: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7050: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7060: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7070: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7080: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7090: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
70a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
70b0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
70c0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
70d0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
70e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
70f0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7100: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7110: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7120: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7130: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7140: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7150: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7160: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7170: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7180: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7190: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
71a0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
71b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
71c0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
71d0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
71e0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
71f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7200: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7210: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7220: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7230: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7240: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7250: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
7260: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
7270: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
7280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7290: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
72a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
72b0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50  OR_HINTS./*.** P
72c0: 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20  rovide hints to 
72d0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
72e0: 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74   particular hint
72f0: 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20   given (and the 
7300: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62  type.** and numb
7310: 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67  er of the vararg
7320: 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73  s parameters) is
7330: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
7340: 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20  he eHintType.** 
7350: 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20  parameter.  See 
7360: 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  the definitions 
7370: 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e  of the BTREE_HIN
7380: 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64  T_* macros for d
7390: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
73a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
73b0: 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20  orHint(BtCursor 
73c0: 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74  *pCur, int eHint
73d0: 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a  Type, ...){.  /*
73e0: 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79   Used only by sy
73f0: 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69  stem that substi
7400: 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73  tute their own s
7410: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f  torage engine */
7420: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7430: 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69   Provide flag hi
7440: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7450: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7460: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7470: 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  tFlags(BtCursor 
7480: 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20  *pCur, unsigned 
7490: 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d  x){.  assert( x=
74a0: 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c  =BTREE_SEEK_EQ |
74b0: 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  | x==BTREE_BULKL
74c0: 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20  OAD || x==0 );. 
74d0: 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78   pCur->hints = x
74e0: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
74f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7500: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
7510: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
7520: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
7530: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
7540: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
7550: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
7560: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
7570: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7580: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
7590: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
75a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
75b0: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
75c0: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
75d0: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
75e0: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
75f0: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
7600: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
7610: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
7620: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
7630: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
7640: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
7650: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
7660: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
7670: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
7680: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
7690: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
76a0: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
76b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
76c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
76d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
76e0: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
76f0: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
7700: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7710: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7720: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
7730: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7740: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
7750: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
7760: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
7770: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
7780: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
7790: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
77a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
77b0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
77c0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
77d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
77e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
77f0: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
7800: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
7810: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
7820: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
7830: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
7840: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
7850: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7860: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
7870: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
7880: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
7890: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
78a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
78b0: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
78c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
78d0: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
78e0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
78f0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
7900: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
7910: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
7920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
7930: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
7940: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
7950: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
7960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7970: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7980: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7990: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
79a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
79b0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
79c0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
79d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
79e0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
79f0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7a10: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7a20: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
7a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7a40: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
7a50: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
7a60: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
7a70: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
7a80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7a90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7aa0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7ab0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7ac0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7ad0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7ae0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7af0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7b00: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7b10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7b20: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7b30: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7b40: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7b50: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
7b60: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
7b70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
7b80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
7b90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
7ba0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
7bb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7bc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
7bd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
7be0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
7bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7c00: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
7c10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7c20: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7c30: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7c40: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7c50: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7c60: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c80: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7c90: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7ca0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7cb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
7cc0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
7cd0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
7ce0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7cf0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
7d00: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
7d10: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7d20: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7d30: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7d40: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7d50: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7d60: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7d70: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7d80: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7da0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7db0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7dc0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
7dd0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
7de0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
7df0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7e00: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
7e10: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7e20: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7e30: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7e40: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7e50: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7e60: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7e70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7e80: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7e90: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7ea0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7eb0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
7ec0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
7ed0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
7ee0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
7ef0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
7f00: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
7f10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7f20: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7f30: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7f40: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7f60: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7f70: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7f80: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7f90: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7fa0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7fb0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7fc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
7fd0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7fe0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
7ff0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8000: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8010: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8020: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8030: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8040: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8050: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8060: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8070: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8080: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8090: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
80a0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
80b0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
80c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
80d0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
80e0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
80f0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8100: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8120: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8130: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8140: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8150: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8160: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8170: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8180: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8190: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
81a0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
81b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
81c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
81d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
81e0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
81f0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8200: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8210: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8220: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8230: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8240: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8250: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8260: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8270: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8280: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8290: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
82a0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
82b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
82c0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
82d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
82e0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
82f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8300: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8310: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8320: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8330: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8340: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
8350: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8360: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
8370: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
8380: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
8390: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
83a0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
83b0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
83c0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
83d0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
83e0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
83f0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8400: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8410: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8420: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8430: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8440: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
8450: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
8460: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
8470: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
8480: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
8490: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
84a0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
84b0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
84c0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
84d0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
84e0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
84f0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8500: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8510: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8520: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8530: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8540: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8550: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
8560: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8570: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8580: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
8590: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
85a0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
85b0: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
85c0: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
85d0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
85e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
85f0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8600: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8610: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8620: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8630: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8640: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
8650: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
8660: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
8670: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
8680: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
8690: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
86a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
86b0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
86c0: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
86d0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
86e0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
86f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8720: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8730: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8740: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8750: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8760: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8770: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8780: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8790: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
87a0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
87b0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
87c0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
87d0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
87e0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
87f0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8800: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8810: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8820: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8830: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8840: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
8850: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
8860: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
8870: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
8880: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
8890: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
88a0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
88b0: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
88c0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
88d0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
88e0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
88f0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8900: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8910: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8920: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8930: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8940: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8950: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8960: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8970: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
8980: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
8990: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
89a0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
89b0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
89c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
89d0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
89e0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
89f0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8a00: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8a10: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8a20: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8a30: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8a40: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8a50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8a60: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8a70: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
8a80: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8a90: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8aa0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
8ab0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8ac0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
8ad0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8ae0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8af0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8b00: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8b10: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8b20: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8b40: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8b50: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8b60: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
8b70: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8b80: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8b90: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8ba0: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
8bb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
8bc0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
8bd0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
8be0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
8bf0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8c00: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8c10: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8c20: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8c30: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8c40: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8c50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8c60: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8c70: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8c80: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8c90: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8ca0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8cb0: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
8cc0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8cd0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
8ce0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
8cf0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8d00: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8d10: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8d20: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8d30: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8d40: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8d50: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8d60: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8d70: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8d80: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8d90: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8da0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8db0: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
8dc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8de0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8df0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8e00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8e10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8e20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8e30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8e40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8e50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8e60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8e70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8e80: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8e90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8eb0: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
8ec0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
8ed0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
8ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
8ef0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
8f00: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
8f10: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
8f20: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
8f30: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
8f40: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
8f50: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
8f60: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
8f70: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
8f80: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8f90: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
8fa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
8fb0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8fc0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
8fd0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8fe0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8ff0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9000: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9010: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9020: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9030: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9040: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9050: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9060: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9070: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
9080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
9090: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
90a0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
90b0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
90c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
90d0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
90e0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
90f0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
9100: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
9110: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
9120: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9130: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9140: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9160: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9170: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9190: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
91a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
91b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
91c0: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
91d0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
91e0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
91f0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9200: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9210: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9220: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
9230: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
9240: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9250: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9260: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9270: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
9280: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9290: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
92a0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
92b0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
92c0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
92d0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
92e0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
92f0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9300: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9310: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
9320: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9330: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9340: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
9350: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
9360: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
9370: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
9380: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
9390: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
93a0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
93b0: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
93c0: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
93d0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
93e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
93f0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
9400: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
9410: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9420: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
9430: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
9440: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
9450: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
9460: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
9470: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9480: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
9490: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
94a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
94b0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
94c0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
94d0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
94e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9500: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
9510: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
9520: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
9530: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9540: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
9550: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
9560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9580: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9590: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
95a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
95b0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
95c0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
95d0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
95e0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
95f0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9600: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9610: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9620: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9630: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9640: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
9650: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
9660: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
9670: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
9680: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
9690: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
96a0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
96b0: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
96d0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
96e0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
96f0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9700: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9710: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9720: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9730: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9740: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
9750: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9760: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9770: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9780: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97a0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
97b0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
97c0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
97d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
97e0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
97f0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9800: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9810: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9820: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9830: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9840: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9850: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9860: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9870: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9880: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9890: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
98a0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
98b0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
98c0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
98d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
98e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
98f0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
9900: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9910: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
9920: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9930: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9940: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9950: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9960: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9970: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9980: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9990: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
99a0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
99b0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
99c0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
99d0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
99e0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
99f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9a00: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9a10: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9a20: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9a30: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9a40: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9a50: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9a60: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9a70: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9a80: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9a90: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9aa0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9ab0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9ac0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9ad0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9ae0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9af0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9b00: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9b10: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9b20: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9b30: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9b40: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9b50: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9b60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9b70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9b80: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9b90: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9ba0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9bb0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9bd0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9be0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9bf0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9c00: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9c10: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9c20: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9c30: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9c40: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9c50: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9c60: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9c80: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9c90: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9ca0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9cc0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9cd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
9ce0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
9cf0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9d00: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9d10: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
9d20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9d30: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
9d40: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
9d50: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
9d60: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9d70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9d80: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
9d90: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
9da0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
9db0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
9dc0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
9dd0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
9de0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
9df0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
9e00: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
9e10: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
9e20: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
9e30: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
9e40: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
9e50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
9e60: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
9e70: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
9e80: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
9e90: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
9ea0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
9eb0: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
9ec0: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
9ed0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
9ee0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
9ef0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
9f00: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9f10: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
9f20: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
9f30: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9f40: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9f50: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
9f60: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
9f70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
9fa0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
9fb0: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9fe0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
9ff0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a000: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
a010: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a020: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a030: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
a040: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
a050: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
a060: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
a070: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
a080: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
a090: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
a0a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
a0b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
a0c0: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
a0d0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
a0e0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
a0f0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
a100: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
a110: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
a120: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
a130: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a140: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
a150: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
a160: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
a170: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a180: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
a190: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a1a0: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
a1b0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
a1c0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
a1d0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
a1e0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a1f0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a200: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a210: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a220: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
a230: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
a240: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
a250: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
a260: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
a270: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
a280: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
a290: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
a2a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
a2b0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
a2c0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
a2d0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
a2e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
a2f0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
a300: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a310: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
a320: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a330: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a340: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
a350: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a360: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
a370: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a380: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a390: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
a3a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a3b0: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
a3c0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
a3d0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
a3e0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
a3f0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
a400: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
a410: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a420: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a430: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
a440: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
a450: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a460: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
a470: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a480: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a4a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a4b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
a4c0: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
a4d0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a4e0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a4f0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
a500: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
a510: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a520: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a530: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
a540: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
a550: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
a560: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
a570: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a580: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
a590: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a5a0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
a5b0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
a5c0: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
a5d0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a5e0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a5f0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a600: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a610: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
a620: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a630: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a640: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a660: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a670: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a680: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a690: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a6a0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a6b0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a6c0: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a6d0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a6e0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a6f0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a700: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a710: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a720: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a730: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a740: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a750: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a760: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a770: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a780: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
a790: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a7a0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a7b0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
a7c0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a7d0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
a7e0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
a7f0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a800: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a810: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
a820: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
a830: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a840: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
a850: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a860: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a870: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
a880: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
a890: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
a8a0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
a8b0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
a8c0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
a8d0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
a8e0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
a8f0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
a900: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
a910: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
a920: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
a930: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
a940: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
a950: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
a960: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
a970: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
a980: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
a990: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
a9a0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
a9b0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
a9c0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
a9d0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
a9e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
a9f0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
aa00: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
aa10: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
aa20: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
aa30: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
aa40: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
aa50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
aa60: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
aa70: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
aa80: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70   pCell!=0 );.  p
aa90: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
aaa0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
aab0: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
aac0: 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
aad0: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67  ayload ){.    Pg
aae0: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
aaf0: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  te(&pCell[info.n
ab00: 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74  Size-4]);.    pt
ab10: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
ab20: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
ab30: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
ab40: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
ab50: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
ab60: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
ab70: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
ab80: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
ab90: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
aba0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
abb0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
abc0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
abd0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
abe0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
abf0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
ac00: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
ac10: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
ac20: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
ac30: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a  ontent area..**.
ac40: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
ac50: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
ac60: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
ac70: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ac80: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
ac90: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
aca0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
acb0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
acc0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
acd0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ace0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
acf0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ad00: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ad10: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ad20: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ad30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ad40: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
ad50: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
ad60: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
ad70: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ada0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
add0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
ade0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
ae10: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ae20: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae40: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
ae50: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
ae60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
ae70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
ae80: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
ae90: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
aea0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
aeb0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aec0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
aed0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aee0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
aef0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af00: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
af10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
af20: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
af30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af40: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
af50: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
af60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
af70: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
af80: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
af90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
afa0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
afb0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
afc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
afd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
aff0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b000: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b020: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b030: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b040: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b060: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b070: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
b080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b090: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b0a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b0b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b0c0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b0d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b0e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b0f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b100: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b110: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b120: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b130: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b140: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b150: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b160: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b170: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b180: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
b1a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
b1b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
b1c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
b1d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b1e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
b1f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
b200: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
b210: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b220: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
b230: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
b240: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b250: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
b260: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
b270: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
b280: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
b290: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
b2a0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
b2b0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
b2c0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
b2d0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
b2e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
b2f0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
b300: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
b310: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b320: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
b330: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b340: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
b350: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
b360: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b370: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
b380: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
b390: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
b3a0: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
b3b0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
b3c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b3d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b3e0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
b3f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b400: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b410: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
b420: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
b430: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
b440: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
b450: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
b460: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
b470: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
b480: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
b490: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
b4a0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b4b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b4c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b4d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b4e0: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
b4f0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
b500: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b510: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
b520: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b530: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
b540: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
b550: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
b560: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
b570: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
b580: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
b590: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
b5a0: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
b5b0: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
b5c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
b5d0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
b5e0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b5f0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
b600: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b610: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
b620: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
b630: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
b640: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
b650: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
b660: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
b670: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
b680: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b690: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b6a0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
b6b0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
b6c0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
b6d0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
b6e0: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
b6f0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
b700: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
b710: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
b720: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
b730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b740: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b760: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
b770: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
b780: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
b790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b7a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
b7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
b7d0: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
b7e0: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
b7f0: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
b800: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
b810: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
b820: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
b830: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
b840: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
b850: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
b860: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
b870: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
b880: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
b890: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
b8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
b8b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
b8c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b8d0: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
b8e0: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
b8f0: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
b900: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
b910: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
b920: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
b930: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
b940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
b950: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
b960: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
b970: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
b980: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
b990: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
b9a0: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
b9b0: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
b9c0: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
b9d0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
b9e0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
b9f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ba00: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
ba10: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
ba20: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
ba30: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
ba40: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
ba50: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
ba60: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
ba70: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
ba80: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
ba90: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
baa0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
bab0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
bac0: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
bad0: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
bae0: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
baf0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
bb00: 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29    assert( pc>0 )
bb10: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
bb20: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bb30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
bb40: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
bb50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bb60: 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46   R-06866-39125 F
bb70: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c  reeblocks are al
bb80: 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69  ways connected i
bb90: 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a  n order of.    *
bba0: 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66  * increasing off
bbb0: 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  set. */.    if( 
bbc0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
bbd0: 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b  || pc<iAddr+4 ){
bbe0: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
bbf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bc00: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
bc10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  0;.    }.    /* 
bc20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
bc30: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
bc40: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
bc50: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
bc60: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
bc70: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
bc80: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bc90: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
bca0: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
bcb0: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
bcc0: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
bcd0: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
bce0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
bcf0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
bd00: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
bd10: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
bd40: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
bd50: 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 3c 20  .      if( pc < 
bd60: 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  pPg->cellOffset+
bd70: 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  2*pPg->nCell || 
bd80: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
bd90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
bda0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
bdb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bdd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c      }else if( x<
bde0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
bdf0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
be00: 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20  1498-58022 In a 
be10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
be20: 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74  ee page, the tot
be30: 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  al.        ** nu
be40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
be50: 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e   fragments may n
be60: 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f  ot exceed 60. */
be70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
be80: 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72  ta[hdr+7]>57 ) r
be90: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20  eturn 0;..      
bea0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
beb0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
bec0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
bed0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
bee0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
bef0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
bf00: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
bf10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
bf20: 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61  ata[iAddr], &aDa
bf30: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
bf40: 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d      aData[hdr+7]
bf50: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
bf60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bf70: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
bf80: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
bf90: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
bfa0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
bfb0: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  .         ** for
bfc0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
bfd0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
bfe0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
bff0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44      put2byte(&aD
c000: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
c010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
c020: 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20  urn &aData[pc + 
c030: 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41  x];.    }.    iA
c040: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63  ddr = pc;.    pc
c050: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
c060: 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c  ta[pc]);.  }whil
c070: 65 28 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75  e( pc );..  retu
c080: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
c090: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
c0a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
c0b0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
c0c0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
c0d0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
c0e0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
c0f0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
c100: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
c110: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
c120: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c130: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
c140: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
c150: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
c160: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
c170: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
c180: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
c190: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
c1a0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
c1b0: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
c1c0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
c1d0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
c1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
c1f0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
c200: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
c210: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
c220: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
c230: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
c240: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
c250: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
c260: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
c270: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
c280: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
c290: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
c2a0: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
c2b0: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
c2c0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
c2d0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
c2e0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
c2f0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
c300: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
c310: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
c320: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
c330: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c340: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
c350: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
c360: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
c370: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
c380: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c390: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c3a0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
c3b0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c3c0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
c3d0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
c3e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
c3f0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c420: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
c430: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
c440: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
c470: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c480: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
c490: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
c4a0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
c4b0: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
c4c0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
c4d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c4e0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c4f0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c510: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
c520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c530: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c540: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c550: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
c560: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
c570: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
c580: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c590: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
c5a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c5b0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
c5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c5d0: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
c5e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c5f0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
c600: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
c610: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
c620: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
c630: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
c640: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
c650: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
c660: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
c670: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
c680: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
c690: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
c6a0: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
c6b0: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
c6c0: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
c6d0: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
c6e0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
c6f0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
c700: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
c710: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
c720: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
c730: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
c740: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
c750: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
c760: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
c770: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
c780: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
c790: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
c7a0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
c7b0: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
c7c0: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
c7d0: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
c7e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c7f0: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
c800: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
c810: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c820: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
c830: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
c840: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
c850: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
c860: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
c870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
c880: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
c890: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
c8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
c8b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c8c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
c8d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
c8e0: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
c8f0: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
c900: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
c910: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
c920: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
c930: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
c940: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c950: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
c960: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
c970: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
c980: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
c990: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
c9a0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
c9b0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
c9c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
c9d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c9e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
c9f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
ca00: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
ca10: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
ca20: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
ca30: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
ca40: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
ca50: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
ca60: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
ca70: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
ca80: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
ca90: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
caa0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
cab0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
cac0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
cad0: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
cae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
caf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
cb00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cb10: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
cb20: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
cb30: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
cb40: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
cb50: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
cb60: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
cb70: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
cb80: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
cb90: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
cba0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
cbb0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
cbc0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
cbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
cbe0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
cbf0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
cc00: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
cc10: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
cc20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cc30: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
cc40: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
cc50: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
cc60: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
cc70: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
cc80: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
cc90: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
cca0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ccb0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ccc0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ccd0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
cce0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
ccf0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
cd00: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
cd10: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
cd20: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
cd30: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
cd40: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
cd50: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
cd60: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
cd70: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
cd80: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
cd90: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
cda0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
cdb0: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
cdc0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
cdd0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
cde0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
cdf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
ce00: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
ce10: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
ce20: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ce30: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
ce40: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
ce50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ce60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ce70: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
ce80: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
ce90: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
cea0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
ceb0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
cec0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
ced0: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
cee0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
cef0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
cf00: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
cf10: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
cf20: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
cf30: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
cf40: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
cf50: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
cf60: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
cf70: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cf80: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
cf90: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
cfa0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
cfb0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
cfc0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
cfd0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
cfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
cff0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d000: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d010: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d030: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d040: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d050: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d060: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d070: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d080: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d090: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d0a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d0b0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
d0c0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
d0d0: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
d0e0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d110: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
d120: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
d130: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
d140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d160: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
d170: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
d180: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
d1b0: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
d1c0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
d1d0: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
d200: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
d210: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
d220: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
d230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
d240: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
d250: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
d260: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
d270: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
d280: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
d290: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
d2a0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
d2b0: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
d2c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
d2d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
d2e0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
d2f0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
d300: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
d310: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
d320: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
d330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
d340: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d360: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
d370: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d390: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
d3a0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
d3b0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
d3c0: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
d3d0: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
d3e0: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
d3f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d400: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
d410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d420: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d430: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d440: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
d450: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
d460: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
d470: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
d480: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
d490: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
d4a0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
d4b0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
d4c0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
d4d0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
d4e0: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
d4f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
d500: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
d510: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
d520: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
d530: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
d540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
d550: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
d560: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
d570: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
d580: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
d590: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
d5a0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
d5b0: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
d5c0: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
d5d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
d5e0: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
d5f0: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
d600: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
d610: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
d620: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
d630: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
d640: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
d650: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
d660: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
d670: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
d680: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
d690: 61 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26  ata[iPtr]))>0 &&
d6a0: 20 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74   iFreeBlk<iStart
d6b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
d6c0: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20  reeBlk<iPtr+4 ) 
d6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d6e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d6f0: 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c    iPtr = iFreeBl
d700: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d710: 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20   iFreeBlk>iLast 
d720: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d730: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d740: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
d750: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
d760: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
d770: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
d780: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
d790: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
d7a0: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
d7b0: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
d7c0: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
d7d0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
d7e0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
d7f0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
d800: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
d810: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
d820: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
d830: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
d840: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
d850: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
d860: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
d870: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
d880: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
d890: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
d8a0: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
d8b0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
d8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d8d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
d8e0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
d8f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d900: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
d910: 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
d920: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d930: 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53  eSize ) return S
d940: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d950: 50 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20  PT;.      iSize 
d960: 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b  = iEnd - iStart;
d970: 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20  .      iFreeBlk 
d980: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d990: 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20  [iFreeBlk]);.   
d9a0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
d9b0: 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20  iPtr is another 
d9c0: 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20  freeblock (that 
d9d0: 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e  is, if iPtr is n
d9e0: 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  ot the freelist.
d9f0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69      ** pointer i
da00: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
da10: 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
da20: 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
da30: 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
da40: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
da50: 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a  he end of iPtr..
da60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
da70: 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20  Ptr>hdr+1 ){.   
da80: 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d     int iPtrEnd =
da90: 20 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65   iPtr + get2byte
daa0: 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b  (&data[iPtr+2]);
dab0: 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45  .      if( iPtrE
dac0: 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a  nd+3>=iStart ){.
dad0: 20 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72          if( iPtr
dae0: 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74  End>iStart ) ret
daf0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
db00: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
db10: 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74   nFrag += iStart
db20: 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20   - iPtrEnd;.    
db30: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
db40: 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20   - iPtr;.       
db50: 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a   iStart = iPtr;.
db60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
db70: 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61    if( nFrag>data
db80: 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e  [hdr+7] ) return
db90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
dba0: 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68  BKPT;.    data[h
dbb0: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
dbc0: 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74    }.  if( iStart
dbd0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
dbe0: 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20  [hdr+5]) ){.    
dbf0: 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62  /* The new freeb
dc00: 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62  lock is at the b
dc10: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
dc20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
dc30: 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73  a,.    ** so jus
dc40: 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c  t extend the cel
dc50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72  l content area r
dc60: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
dc70: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  e another.    **
dc80: 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20   freelist entry 
dc90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21  */.    if( iPtr!
dca0: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
dcb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dcc0: 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74  KPT;.    put2byt
dcd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
dce0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
dcf0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dd00: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
dd10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
dd20: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
dd30: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
dd40: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
dd50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
dd60: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
dd70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
dd80: 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
dd90: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
dda0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
ddb0: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ], iSize);.  }. 
ddc0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
ddd0: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
de00: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
de10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
de20: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
de30: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
de40: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
de50: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
de60: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
de70: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
de80: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
de90: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
dea0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
deb0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
dec0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
ded0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
dee0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
def0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
df00: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
df10: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
df20: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
df30: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
df40: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
df50: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
df60: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
df70: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
df80: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
df90: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
dfa0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
dfb0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
dfc0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
dfd0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
dfe0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dff0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
e000: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
e010: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
e020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e030: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e040: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e050: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
e060: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
e070: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
e080: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
e090: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
e0a0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
e0b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
e0c0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
e0d0: 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
e0e0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e0f0: 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
e100: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
e110: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
e120: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
e130: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
e140: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
e150: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
e160: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
e170: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
e180: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
e190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
e1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
e1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
e1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e1e0: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
e1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
e200: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e210: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
e220: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
e230: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e240: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
e250: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
e260: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
e270: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
e280: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
e290: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
e2a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
e2b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
e2c0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
e2d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
e2e0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
e2f0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e300: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  yLeaf = 0;.     
e310: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e320: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
e330: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
e340: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e350: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e360: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
e370: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
e380: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e390: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
e3a0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e3b0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
e3c0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
e3d0: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
e3e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e3f0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d  NCE-OF: R-27225-
e400: 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66  53936 A value of
e410: 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   2 means the pag
e420: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
e430: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d  .    ** index b-
e440: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e450: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
e460: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
e470: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e480: 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35  F: R-16571-11615
e490: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d   A value of 10 m
e4a0: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e4b0: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69   a leaf.    ** i
e4c0: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
e4d0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e4e0: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
e4f0: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
e500: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e510: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
e520: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
e530: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
e540: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e550: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
e560: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
e570: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
e580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
e590: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e5a0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
e5b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
e5c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
e5d0: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
e5e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
e5f0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
e600: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
e610: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
e620: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e630: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
e640: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
e650: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
e660: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
e670: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e680: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
e690: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
e6a0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
e6b0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
e6c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
e6d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e6e0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
e6f0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
e700: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
e710: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
e720: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
e730: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
e740: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
e750: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
e760: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
e770: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
e780: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
e790: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
e7a0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
e7b0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
e7c0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
e7d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
e7e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
e7f0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
e800: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
e810: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
e820: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e830: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
e840: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e860: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e870: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e880: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
e890: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
e8a0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
e8b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e8c0: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
e8d0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e8e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e8f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e900: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
e910: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e920: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e930: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
e940: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e950: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
e960: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e970: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
e980: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
e990: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
e9a0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
e9b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
e9c0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
e9d0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
e9e0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
e9f0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
ea00: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
ea10: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
ea20: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
ea30: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
ea40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
ea50: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
ea60: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
ea70: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
ea80: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
ea90: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
eaa0: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
eab0: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
eac0: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
ead0: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
eae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eaf0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
eb00: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
eb10: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
eb30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
eb40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
eb50: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
eb60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
eb70: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
eb80: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
eb90: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
eba0: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
ebb0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
ebc0: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ebd0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
ebe0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
ebf0: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
ec00: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ec10: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
ec20: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
ec50: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
ec60: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
ec70: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
ec80: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
ec90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
eca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
ecb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
ecc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ecd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
ece0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
ecf0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
ed00: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
ed10: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
ed20: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
ed30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ed40: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
ed50: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
ed60: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
ed70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ed80: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
ed90: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
eda0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
edb0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
edc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
edd0: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
ede0: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
edf0: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
ee00: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
ee10: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
ee20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ee30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ee40: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
ee50: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
ee60: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
ee70: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
ee80: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
ee90: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
eea0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
eeb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
eec0: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
eed0: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
eee0: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
eef0: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ef00: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
ef10: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
ef20: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
ef30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ef40: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
ef50: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ef60: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
ef70: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
ef80: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
ef90: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
efa0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
efb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
efc0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
efd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
efe0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
eff0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f000: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f010: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f020: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f030: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f060: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
f070: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
f080: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
f090: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f0a0: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
f0b0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
f0c0: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
f0d0: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
f0e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
f0f0: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
f100: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
f110: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
f120: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
f130: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
f140: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
f150: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
f160: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
f170: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
f180: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
f190: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f1a0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
f1b0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
f1c0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
f1d0: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
f1e0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
f1f0: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
f200: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
f210: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
f220: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
f230: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
f240: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f250: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
f260: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
f270: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
f280: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
f290: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
f2a0: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
f2b0: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
f2c0: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
f2d0: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
f2e0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
f2f0: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
f300: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
f310: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
f320: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
f330: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
f340: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
f350: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f360: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
f370: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f390: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
f3a0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
f3b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
f3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f3d0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
f3e0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
f3f0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
f400: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
f410: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
f420: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f430: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
f440: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
f450: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
f460: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f470: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
f480: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f490: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
f4a0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f4b0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f4c0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f4e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f4f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f500: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
f510: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f520: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
f530: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
f540: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
f550: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
f560: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
f570: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
f580: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f5a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
f5c0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f5d0: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
f5e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
f5f0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
f600: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
f610: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
f620: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
f630: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
f640: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f650: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
f660: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
f670: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
f680: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
f690: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
f6a0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
f6b0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
f6c0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
f6d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
f6e0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
f6f0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
f700: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
f710: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
f720: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
f730: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
f740: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
f750: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f760: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f770: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
f790: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
f7a0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
f7b0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
f7c0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
f7d0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
f7e0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
f7f0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
f800: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
f810: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
f820: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
f830: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
f840: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f850: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
f860: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f880: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
f890: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
f8a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
f8b0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
f8c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
f8d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f8e0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
f8f0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
f900: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
f910: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
f920: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
f930: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
f940: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
f950: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
f960: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
f970: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
f980: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f990: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
f9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f9b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
f9d0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
f9e0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
f9f0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
fa00: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
fa10: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
fa20: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
fa30: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
fa40: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
fa50: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
fa60: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
fa70: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
fa80: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
fa90: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
faa0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
fab0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
fac0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
fad0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
fae0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
faf0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
fb00: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
fb10: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
fb20: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
fb30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fb40: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
fb50: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
fb60: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
fb70: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
fb80: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
fb90: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
fba0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
fbb0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fbc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fbd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fbe0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
fbf0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
fc00: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
fc10: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
fc20: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
fc30: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
fc40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
fc50: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
fc60: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
fc70: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
fc80: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
fc90: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
fca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
fcb0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
fcc0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
fcd0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
fce0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
fcf0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
fd00: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
fd10: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
fd20: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fd30: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
fd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fd50: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
fd60: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
fd70: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
fd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fd90: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
fda0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fdb0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
fdc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
fde0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
fdf0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
fe00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
fe10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
fe20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fe30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fe40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fe50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fe60: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
fe70: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
fe80: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
fe90: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
fea0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
feb0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
fec0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
fed0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
fee0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
fef0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
ff00: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
ff10: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
ff20: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
ff30: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
ff40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ff50: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ff60: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ff70: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
ff80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ff90: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
ffa0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
ffb0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
ffc0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
ffd0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
ffe0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
fff0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
10000 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
10010 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
10020 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
10030 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
10040 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
10050 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
10060 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
10070 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
10080 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
10090 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
100a0 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
100b0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
100c0 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
100d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
100e0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
100f0 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
10100 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
10110 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
10120 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
10130 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
10140 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
10150 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
10160 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10170 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
10180 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
10190 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
101a0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
101b0 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
101c0 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
101d0 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
101e0 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
101f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
10200 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
10210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10220 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
10230 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
10240 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
10250 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
10260 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
10270 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
10280 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10290 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
102a0 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
102b0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
102c0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
102d0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
102e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
102f0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
10300 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10310 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
10320 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
10330 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
10340 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
10350 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
10360 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
10370 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
10380 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
10390 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
103a0 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
103b0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
103c0 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
103d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
103e0 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
103f0 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
10400 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
10410 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
10420 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
10430 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
10440 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
10450 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
10460 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
10470 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
10480 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
10490 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
104a0 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
104b0 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
104c0 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
104d0 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
104e0 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
104f0 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
10500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
10510 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
10520 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
10540 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
10550 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
10560 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10570 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
10580 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
10590 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
105a0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
105b0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
105c0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
105d0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
105e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
105f0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
10600 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
10610 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10620 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
10630 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
10640 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
10650 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
10660 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
10670 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
10680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10690 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
106a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
106b0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
106c0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
106d0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
106e0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
106f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
10700 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10710 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10720 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10730 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10750 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10760 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10770 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10780 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10790 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
107a0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
107b0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
107c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
107d0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
107e0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
107f0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10800 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10810 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10820 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10830 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10840 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10850 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10870 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10880 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10890 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
108a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
108b0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
108c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
108d0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
108e0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
108f0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
10900 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10910 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10930 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10940 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10950 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10960 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10970 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10980 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10990 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
109a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
109b0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
109c0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
109d0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
109e0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
109f0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
10a00 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10a10 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10a20 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10a30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10a40 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10a50 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10a60 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10a70 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10a80 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10a90 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10aa0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
10ab0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
10ac0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
10ad0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
10ae0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
10af0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
10b00 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10b10 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10b20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10b30 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10b40 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10b50 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10b70 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10b80 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10b90 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10ba0 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
10bb0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
10bc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10bd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
10be0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
10bf0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
10c00 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10c10 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10c20 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10c30 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10c40 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10c50 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10c60 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10c80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10c90 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
10cc0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
10cd0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
10ce0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
10cf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
10d00 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10d10 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10d20 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10d30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10d40 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10d50 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10d60 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10d90 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10da0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
10db0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
10dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10dd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10de0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10df0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
10e00 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10e10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10e20 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10e30 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10e40 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10e50 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10e70 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10e80 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10e90 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10ea0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
10eb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10ec0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
10ed0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
10ee0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
10ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10f00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
10f10 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
10f20 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
10f30 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
10f40 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
10f50 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
10f60 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
10f70 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10f80 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
10f90 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
10fa0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
10fb0 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
10fc0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10fd0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10fe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
10ff0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
11000 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
11010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11030 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
11040 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11050 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
11060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
11070 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
11080 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
11090 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
110a0 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
110b0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
110c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
110d0 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
110e0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
110f0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
11100 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
11110 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
11120 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
11130 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
11140 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
11150 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
11160 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
11170 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
11180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11190 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
111a0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
111b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
111c0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
111d0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
111e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
111f0 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
11200 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  ge_error:.  if( 
11210 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61  pCur ) pCur->iPa
11220 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65  ge--;.  testcase
11230 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
11240 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
11250 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
11260 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
11270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11280 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
11290 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
112a0 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
112b0 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
112c0 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
112d0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
112e0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
112f0 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
11300 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
11310 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
11320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11330 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
11340 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
11350 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
11360 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11370 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11380 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11390 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
113a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
113b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
113c0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
113d0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
113e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
113f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
11410 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
11420 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
11430 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
11440 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11450 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11460 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
11470 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
11480 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  Null(pPage);.}..
11490 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75  /*.** Get an unu
114a0 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  sed page..**.** 
114b0 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
114c0 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67  like btreeGetPag
114d0 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64  e() with the add
114e0 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ition:.**.**   *
114f0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
11500 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20   already in use 
11510 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
11520 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74  urpose, immediat
11530 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65  ely.**      rele
11540 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72  ase it and retur
11550 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52  n an SQLITE_CURR
11560 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20  UPT error..**   
11570 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  *  Make sure the
11580 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20   isInit flag is 
11590 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20  clear.*/.static 
115a0 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73  int btreeGetUnus
115b0 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  edPage(.  BtShar
115c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
115d0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
115e0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
115f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11600 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
11610 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
11620 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
11630 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
11640 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
11650 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
11660 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11670 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11680 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
11690 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
116a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65  .  int rc = btre
116b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
116c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
116d0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
116e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
116f0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
11700 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
11710 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
11720 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
11730 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11740 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
11750 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
11760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11770 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
11780 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
11790 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
117a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
117b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
117c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  ;.}.../*.** Duri
117d0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
117e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
117f0 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
11800 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
11810 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
11820 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
11830 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
11840 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
11850 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
11860 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
11870 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
11880 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11890 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
118a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
118b0 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
118c0 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
118d0 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
118e0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
118f0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
11900 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
11910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
11920 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
11930 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
11940 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
11950 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
11960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11970 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
11980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11990 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
119a0 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
119b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
119c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
119d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
119e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
119f0 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
11a00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
11a10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
11a20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
11a30 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
11a40 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
11a50 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
11a60 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
11a70 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
11a80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
11a90 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
11aa0 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
11ab0 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
11ac0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
11ad0 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
11ae0 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
11af0 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
11b00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
11b10 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
11b20 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
11b30 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
11b40 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
11b50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
11b60 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
11b70 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
11b80 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
11b90 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
11ba0 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
11bb0 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
11bc0 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
11bd0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
11be0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
11bf0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
11c00 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
11c10 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
11c20 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
11c40 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11c50 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
11c60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11c70 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
11c80 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11c90 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
11ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11cb0 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
11cc0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
11cd0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11ce0 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
11cf0 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
11d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11d20 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
11d30 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11d50 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
11d60 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
11d70 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
11d80 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
11d90 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
11da0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
11db0 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
11dc0 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
11dd0 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
11de0 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
11df0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
11e00 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
11e10 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
11e20 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
11e30 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
11e40 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
11e50 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
11e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
11e70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
11e80 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
11e90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
11ea0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
11eb0 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
11ec0 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
11ed0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
11ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
11ef0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
11f00 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
11f10 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
11f20 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
11f30 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
11f40 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
11f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
11f60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11f70 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
11f80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
11f90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
11fa0 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
11fb0 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
11fc0 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
11fd0 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
11fe0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11ff0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
12000 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
12010 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
12020 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
12030 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
12040 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
12050 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
12060 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
12070 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
12080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12090 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
120a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
120b0 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
120c0 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
120d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
120e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
120f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12100 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
12110 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
12120 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12130 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
12140 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
12150 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12160 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
12170 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
12180 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
12190 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
121a0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
121b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
121c0 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
121d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
121e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
121f0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12200 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
12210 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
12220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12240 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
12250 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
12260 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
12290 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
122a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
122b0 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
122c0 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
122d0 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
122e0 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
122f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12300 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12310 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
12320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
12330 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
12360 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
12370 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
12380 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
12390 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
123a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
123b0 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
123c0 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
123d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
123e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
123f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
12400 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
12410 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
12420 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
12430 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
12440 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
12450 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
12460 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
12470 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
12480 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
12490 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
124a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124b0 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
124c0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
124d0 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
124e0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
124f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
12500 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
12510 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
12540 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
12550 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
12580 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12590 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
125a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
125b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
125c0 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
125d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
125e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
125f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12600 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
12610 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
12620 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
12630 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
12640 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
12650 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
12660 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
12670 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
12680 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
12690 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
126a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
126b0 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
126c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
126d0 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
126e0 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
126f0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
12700 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12710 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
12720 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
12730 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
12740 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
12750 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
12760 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
12770 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12780 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
12790 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
127a0 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
127b0 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
127c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
127d0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
127e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
127f0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
12800 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
12810 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
12820 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
12830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12840 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
12850 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
12860 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
12870 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
12880 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12890 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
128a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
128b0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
128c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
128d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
128e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
128f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
12900 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
12910 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
12920 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
12930 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
12940 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
12950 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
12960 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
12970 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
12980 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
12990 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
129a0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
129b0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
129c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
129d0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
129e0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
129f0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12a00 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
12a10 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
12a20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
12a30 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
12a40 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
12a50 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
12a60 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
12a70 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
12a80 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
12a90 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
12aa0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
12ab0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
12ac0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
12ad0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
12ae0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
12af0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
12b00 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
12b10 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
12b20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12b30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12b40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b60 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12b70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
12b80 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
12b90 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
12ba0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12bb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12bc0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12bd0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12be0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
12c10 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
12c20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
12c30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
12c40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12c50 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12c70 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12c80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ca0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12cb0 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
12cc0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
12cd0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12ce0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12cf0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
12d00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12d10 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12d20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12d30 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12d40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12d50 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
12d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12d70 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
12d80 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
12d90 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
12da0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12db0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
12dc0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
12dd0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
12de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
12df0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
12e00 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12e10 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12e30 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
12e40 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
12e50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
12e60 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
12e70 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12e90 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
12ea0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
12eb0 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
12ed0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
12ee0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
12ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12f00 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
12f10 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
12f20 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
12f30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f40 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
12f50 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
12f60 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f70 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
12f80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
12f90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12fa0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12fc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12fe0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
12ff0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
13000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13010 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
13020 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
13030 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
13040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13060 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13070 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13080 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
130a0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
130b0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
130c0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
130d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
130e0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
130f0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
13100 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
13110 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
13120 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
13130 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
13140 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
13150 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
13160 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
13170 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
13180 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
13190 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
131a0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
131b0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
131c0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
131d0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
131e0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
131f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
13200 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
13210 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
13220 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13230 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
13240 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
13250 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
13260 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
13270 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
13280 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
13290 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
132a0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
132b0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
132c0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
132d0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
132e0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
132f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
13300 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13310 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
13320 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13330 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
13340 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
13350 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
13360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13370 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
13380 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
13390 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
133a0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
133b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
133c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
133d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
133e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
133f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13400 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13410 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
13420 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
13430 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
13460 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
13470 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
13480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
134a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
134b0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
134c0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
134d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
134e0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
134f0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
13500 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
13510 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
13520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13540 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
13550 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13560 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
13570 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
13580 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
13590 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
135a0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
135b0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
135c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
135d0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
135e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
135f0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
13600 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
13610 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
13620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
13630 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
13640 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
13650 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13660 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
13670 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
13680 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
13690 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
136a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
136c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
136d0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
136e0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
136f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
13700 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13710 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
13720 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
13730 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
13740 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
13750 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
13760 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
13770 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
13780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
13790 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
137a0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
137b0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
137c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
137d0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
137e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
137f0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
13800 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
13810 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
13820 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
13830 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13840 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13850 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13860 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
13870 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
13880 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
13890 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
138a0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
138b0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
138c0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
138d0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
138e0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
138f0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
13900 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
13910 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
13920 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
13930 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
13940 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
13950 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
13960 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
13970 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
13980 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
13990 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
139a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
139b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
139c0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
139d0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
139e0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
139f0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
13a00 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
13a10 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
13a20 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13a30 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
13a40 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
13a50 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
13a60 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13a70 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
13a80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13a90 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
13aa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
13ab0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
13ac0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
13ad0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
13ae0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
13af0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
13b00 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13b10 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
13b20 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
13b30 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
13b40 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
13b50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13b60 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
13b70 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
13b80 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
13b90 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13ba0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
13bb0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
13bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13bd0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13bf0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
13c00 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
13c10 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
13c20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
13c30 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13c40 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
13c50 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
13c60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13c70 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13c80 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13c90 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13ca0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
13cb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
13cc0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13cd0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
13ce0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13cf0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
13d00 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
13d10 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13d20 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
13d30 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
13d40 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
13d50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13d60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13d70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13d90 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
13da0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
13db0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
13dc0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
13dd0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
13df0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
13e00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13e10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13e20 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
13e30 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
13e40 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13e50 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
13e60 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13e70 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13e80 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
13e90 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
13ea0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
13eb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13ec0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
13ed0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
13ee0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
13ef0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13f00 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
13f10 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
13f20 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
13f30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13f40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13f50 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
13f60 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13f90 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
13fa0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
13fb0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
13fc0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
13fd0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
13fe0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
13ff0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14000 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14010 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
14020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14030 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14040 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14050 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
14060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14070 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14080 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14090 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
140a0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
140b0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
140c0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
140d0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
140e0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
140f0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
14100 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
14110 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
14120 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14130 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14140 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
14150 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
14160 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
14170 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
14180 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
14190 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
141a0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
141b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
141c0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
141d0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
141e0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
141f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
14200 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
14210 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
14220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14230 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
14240 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
14250 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
14260 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
14270 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
14280 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
14290 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
142a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
142b0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
142c0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
142d0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
142e0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
142f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14310 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14320 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14330 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14340 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14350 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14360 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14370 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14390 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
143a0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
143b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
143c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
143d0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
143e0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
143f0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14410 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14420 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14430 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14440 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
14450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14460 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14470 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14480 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14490 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
144a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
144b0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
144c0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
144d0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
144e0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
144f0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
14500 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
14510 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
14520 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
14530 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
14540 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
14550 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
14560 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
14570 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14580 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
14590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
145a0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
145b0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
145c0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
145d0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
145e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
145f0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
14600 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14610 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
14620 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
14630 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14640 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
14670 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
14680 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
14690 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
146a0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
146b0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
146c0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
146d0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
146e0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
146f0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
14700 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
14710 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
14720 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
14730 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
14740 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
14750 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
14760 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
14770 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
14780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14790 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
147a0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
147b0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
147c0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
147d0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
147e0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
147f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14800 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
14810 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
14820 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
14830 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14840 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14850 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14860 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14870 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14880 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
14890 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
148a0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
148b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
148c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
148d0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
148e0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
148f0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14900 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
14910 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
14920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14930 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
14940 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14950 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
14960 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
14970 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
14980 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
14990 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
149a0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
149b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
149c0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
149d0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
149e0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
149f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14a00 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
14a10 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
14a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14a30 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
14a40 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
14a50 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
14a60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14a70 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
14a80 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
14a90 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
14aa0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
14ab0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14ac0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
14ad0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
14ae0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
14af0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
14b00 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
14b10 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
14b20 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
14b30 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
14b40 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
14b50 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
14b60 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
14b70 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14b80 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14b90 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
14ba0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
14bb0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
14bc0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
14bd0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
14be0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
14bf0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
14c00 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
14c10 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
14c20 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
14c30 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
14c40 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
14c50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
14c60 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
14c70 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
14c80 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
14c90 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
14ca0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
14cb0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
14cc0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
14cd0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
14ce0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
14cf0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
14d00 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
14d10 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
14d20 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
14d30 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
14d40 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
14d50 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
14d60 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
14d70 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
14d80 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
14d90 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
14da0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
14db0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
14dc0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
14dd0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
14de0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
14df0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
14e00 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
14e10 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
14e20 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
14e30 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
14e40 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
14e50 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
14e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
14e70 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
14e80 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
14e90 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
14ea0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
14eb0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
14ec0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
14ed0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
14ee0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
14ef0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
14f00 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
14f10 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
14f20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
14f30 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
14f40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
14f50 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
14f60 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
14f70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
14f80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14f90 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
14fa0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
14fb0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
14fc0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
14fd0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
14fe0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
14ff0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
15000 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
15010 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
15020 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
15030 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
15040 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
15050 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
15060 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
15070 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
15080 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
15090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
150a0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
150b0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
150c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
150d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
150e0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
150f0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
15100 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
15110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
15120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15130 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15140 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15150 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
15160 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
15170 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
15180 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
15190 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
151a0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
151b0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
151c0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
151d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
151e0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
151f0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
15200 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
15210 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
15220 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
15230 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
15240 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
15250 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
15260 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
15270 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
15280 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
15290 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
152a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
152b0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
152c0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
152d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
152e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
152f0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
15300 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
15310 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
15320 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
15330 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
15340 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
15350 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
15360 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
15370 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
15380 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
15390 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
153a0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
153b0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
153c0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
153d0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
153e0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
153f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
15400 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
15410 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
15420 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
15430 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
15440 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
15450 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
15460 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
15470 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
15480 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
15490 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
154a0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
154b0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
154c0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
154d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
154e0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
154f0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
15500 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
15510 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
15520 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15530 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15540 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
15550 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
15560 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
15570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15580 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
15590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
155a0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
155b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
155c0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
155d0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
155e0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
155f0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
15600 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
15610 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
15620 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
15630 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
15640 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
15650 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
15660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15680 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
15690 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
156a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
156b0 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
156c0 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
156d0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
156e0 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
156f0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
15700 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
15710 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
15720 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
15730 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
15740 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
15750 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
15760 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
15770 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
15780 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
15790 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
157a0 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
157b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
157c0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
157d0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
157e0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
157f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15800 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15810 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15820 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15830 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15840 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15850 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
15860 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15870 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15880 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
158a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
158b0 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
158c0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
158d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
158e0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
158f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
15900 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
15910 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
15920 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
15930 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
15940 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
15950 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
15960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
15970 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
15980 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
15990 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
159a0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
159b0 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
159c0 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
159d0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
159e0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
159f0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
15a00 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
15a10 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
15a20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
15a30 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
15a40 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
15a50 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
15a60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15a70 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
15a80 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
15a90 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15aa0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15ab0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
15ac0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15ad0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15ae0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15af0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15b00 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
15b10 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
15b20 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15b30 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15b40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15b50 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
15b60 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
15b70 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
15b80 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
15b90 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
15ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15bb0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
15bc0 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
15bd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15be0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
15bf0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
15c00 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
15c10 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15c20 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
15c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15c40 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15c50 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15c60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15c70 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15c80 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15c90 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
15ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15cb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15cd0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15ce0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15cf0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
15d00 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
15d10 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
15d20 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
15d30 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
15d40 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
15d50 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
15d60 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
15d70 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
15d80 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
15d90 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
15da0 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
15db0 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
15dc0 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
15dd0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
15de0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
15df0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
15e00 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
15e10 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
15e20 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
15e30 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
15e40 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
15e50 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
15e60 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
15e70 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
15e80 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
15e90 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
15ea0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
15eb0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15ec0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
15ed0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
15ee0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
15ef0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f10 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
15f20 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
15f30 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
15f40 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
15f50 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
15f60 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
15f70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15f80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15f90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15fa0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15fb0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15fc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15fd0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
15fe0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
15ff0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
16000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16010 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16030 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  dif../*.** Chang
16040 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
16050 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
16060 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16070 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
16080 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
16090 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
160a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
160b0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
160c0 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
160d0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
160e0 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
160f0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
16100 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
16110 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
16120 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
16130 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
16140 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
16150 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
16160 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
16170 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
16180 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
16190 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
161a0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
161b0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
161c0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
161d0 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
161e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
161f0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
16200 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
16210 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
16220 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
16230 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
16240 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
16250 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
16260 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
16270 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
16280 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
16290 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
162a0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
162b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
162c0 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
162d0 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
162e0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
162f0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
16300 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
16310 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
16320 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
16330 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
16340 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
16350 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
16360 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
16370 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16380 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
16390 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
163a0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
163b0 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
163c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
163d0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
163e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
163f0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
16400 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
16410 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
16420 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16430 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
16440 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
16450 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
16460 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
16470 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16480 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
16490 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
164a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
164b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
164c0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
164d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
164e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
164f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
16500 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
16510 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
16520 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16530 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
16540 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
16550 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
16560 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
16570 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
16580 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
16590 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
165a0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
165b0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
165c0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
165d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
165e0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
165f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
16600 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
16610 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
16620 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
16630 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
16640 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
16650 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16660 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
16670 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
16680 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
16690 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
166a0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
166b0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
166c0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
166d0 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
166e0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
166f0 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
16700 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16720 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16730 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
16740 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
16750 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16760 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
16770 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
16780 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
16790 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
167a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
167b0 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
167c0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
167d0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
167e0 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
167f0 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
16800 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
16810 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
16820 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
16830 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
16840 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
16850 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
16860 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
16870 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
16880 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
16890 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
168a0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
168b0 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
168c0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
168d0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
168e0 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
168f0 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
16900 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16910 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
16920 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
16930 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
16940 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
16950 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
16960 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
16970 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
16980 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
16990 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
169a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
169b0 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
169c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
169d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
169e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
169f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16a00 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
16a10 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
16a20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
16a30 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
16a40 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16a50 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
16a60 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
16a70 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
16a80 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
16a90 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
16aa0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
16ab0 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
16ac0 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
16ad0 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
16ae0 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
16af0 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
16b00 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
16b10 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
16b20 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
16b30 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
16b40 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
16b50 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
16b60 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
16b70 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
16b80 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
16b90 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
16ba0 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
16bb0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
16bc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16bd0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
16be0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16bf0 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
16c00 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16c10 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
16c20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16c30 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
16c40 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16c50 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
16c60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16c70 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16c80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
16c90 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
16ca0 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
16cb0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
16cc0 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
16cd0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
16ce0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
16cf0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
16d00 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
16d10 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
16d20 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
16d30 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
16d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16d50 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
16d60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
16d70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
16d80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16d90 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
16da0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
16db0 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
16dc0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16dd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16de0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16df0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
16e00 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
16e10 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
16e20 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
16e30 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
16e40 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
16e50 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
16e60 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
16e70 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
16e80 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
16e90 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
16ea0 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
16eb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16ec0 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
16ed0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
16ee0 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
16ef0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
16f00 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
16f10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
16f20 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
16f30 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
16f40 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
16f50 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
16f60 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
16f70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
16f80 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
16f90 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
16fa0 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
16fb0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
16fc0 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
16fd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16fe0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
16ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17000 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
17010 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
17020 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
17030 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
17040 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
17050 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
17060 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
17070 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
17080 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
17090 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
170a0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
170b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
170c0 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
170d0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
170e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
170f0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
17100 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17110 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
17120 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
17130 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
17140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17150 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
17160 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17170 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
17180 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17190 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
171a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
171b0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
171c0 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
171d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
171e0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
171f0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
17200 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
17210 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
17220 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
17230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
17240 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
17250 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
17260 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
17270 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
17280 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
17290 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
172a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
172b0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
172c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
172d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
172e0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
172f0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
17300 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
17310 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
17320 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
17330 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
17340 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
17350 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
17360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17370 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17380 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
17390 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
173a0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
173b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
173c0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
173d0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
173e0 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
173f0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
17400 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
17410 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
17420 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
17430 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
17440 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
17450 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17460 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17470 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
17480 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
17490 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
174a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
174b0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
174c0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
174d0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
174e0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
174f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17500 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
17510 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
17520 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
17530 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
17540 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
17550 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
17560 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
17570 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
17580 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
17590 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
175a0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
175b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
175c0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
175d0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
175e0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
175f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
17600 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17610 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
17620 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
17630 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
17640 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
17650 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
17660 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
17670 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
17680 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17690 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
176a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
176b0 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
176c0 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
176d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
176e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
176f0 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
17700 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
17710 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
17720 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
17730 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
17740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17750 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
17760 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
17770 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
17780 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
17790 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
177a0 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
177b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
177c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
177d0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
177e0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
177f0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
17800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17810 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
17820 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
17830 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
17840 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
17850 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
17860 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
17870 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
17880 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
17890 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
178a0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
178b0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
178c0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
178d0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
178e0 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
178f0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
17900 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
17910 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
17920 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
17930 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
17940 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
17950 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
17960 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
17970 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
17980 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
17990 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
179a0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
179b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
179c0 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
179d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
179e0 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
179f0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
17a00 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
17a10 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
17a20 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
17a30 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
17a40 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
17a50 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
17a60 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
17a70 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
17a80 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
17a90 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
17aa0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
17ab0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17ac0 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
17ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
17ae0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17af0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
17b00 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17b10 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
17b20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
17b30 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
17b40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17b50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
17b60 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
17b70 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
17b80 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17b90 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
17ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17bb0 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
17bc0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
17bd0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
17be0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17bf0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
17c00 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
17c10 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
17c20 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
17c30 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
17c40 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
17c50 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
17c60 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
17c70 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
17c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
17c90 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
17ca0 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
17cb0 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
17cc0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
17cd0 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
17ce0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
17cf0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
17d00 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
17d10 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
17d20 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
17d30 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
17d40 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
17d50 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
17d60 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
17d70 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
17d80 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
17d90 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
17da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17db0 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
17dc0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
17dd0 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
17de0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
17df0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
17e00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17e10 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
17e20 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
17e30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17e50 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17e60 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
17e70 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
17e80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
17e90 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
17ea0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
17eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
17ed0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
17ee0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
17ef0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17f00 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20  : R-15465-20813 
17f10 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  The maximum and 
17f20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  minimum embedded
17f30 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20   payload.    ** 
17f40 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68  fractions and th
17f50 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  e leaf payload f
17f60 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d  raction values m
17f70 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61  ust be 64, 32, a
17f80 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  nd 32..    **.  
17f90 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
17fa0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
17fb0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
17fc0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
17fd0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
17fe0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
17ff0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
18000 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
18010 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
18020 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
18030 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
18040 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18050 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18060 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
18070 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
18080 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
18090 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
180a0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
180b0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
180c0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
180d0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
180e0 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
180f0 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
18100 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
18110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18120 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69  e. */.    pageSi
18130 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
18140 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
18150 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56  <<16);.    /* EV
18160 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30  IDENCE-OF: R-250
18170 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a  08-21688 The siz
18180 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61  e of a page is a
18190 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20   power of two.  
181a0 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32    ** between 512
181b0 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75   and 65536 inclu
181c0 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sive. */.    if(
181d0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
181e0 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
181f0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
18200 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
18210 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
18220 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
18230 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18240 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18250 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18260 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
18270 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =0 );.    /* EVI
18280 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31  DENCE-OF: R-5931
18290 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73  0-51205 The "res
182a0 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a  erved space" siz
182b0 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a  e in the 1-byte.
182c0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
182d0 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74  t offset 20 is t
182e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
182f0 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
18300 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
18310 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65   each page to re
18320 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73  serve for extens
18330 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  ions. .    **.  
18340 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
18350 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
18360 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
18370 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
18380 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
18390 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
183a0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
183b0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
183c0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
183d0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
183e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
183f0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62  der. */.    usab
18400 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
18410 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
18420 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
18430 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
18440 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
18450 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
18460 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
18470 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
18480 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
18490 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
184a0 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
184b0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
184c0 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
184d0 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
184e0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
184f0 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
18500 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
18510 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
18520 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
18530 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18540 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
18550 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
18560 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
18570 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
18580 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
18590 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
185a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
185b0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
185c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
185d0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
185e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
185f0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
18600 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
18610 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
18620 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
18630 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
18640 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
18650 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
18680 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
18690 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
186a0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74    }.    if( (pBt
186b0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
186c0 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
186d0 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  e)==0 && nPage>n
186e0 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
186f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
18700 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18710 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18720 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18730 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18740 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
18750 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
18760 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
18770 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
18780 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
18790 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
187a0 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
187b0 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
187c0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
187d0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
187e0 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
187f0 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
18800 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
18810 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18820 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18830 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
18840 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
18850 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
18860 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
18870 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
18880 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
18890 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
188a0 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
188b0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
188c0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
188d0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
188e0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
188f0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
18900 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
18910 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
18920 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
18930 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
18940 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
18950 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
18960 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
18970 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
18980 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
18990 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
189a0 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
189b0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
189c0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
189d0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
189e0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
189f0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
18a00 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
18a10 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
18a20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18a30 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
18a40 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
18a50 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
18a60 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
18a70 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
18a80 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
18a90 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
18aa0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
18ab0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
18ac0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
18ad0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
18ae0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
18af0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
18b00 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
18b10 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
18b20 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
18b30 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
18b40 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
18b50 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
18b60 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
18b70 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
18b80 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
18b90 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
18ba0 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
18bb0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
18bc0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
18bd0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
18be0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
18bf0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
18c00 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
18c10 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
18c20 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
18c30 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
18c40 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
18c50 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
18c60 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
18c70 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
18c80 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
18c90 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
18ca0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
18cb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
18cc0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
18cd0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
18ce0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
18cf0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
18d00 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
18d10 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
18d20 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
18d30 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
18d40 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
18d50 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
18d60 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
18d70 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
18d80 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
18d90 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18da0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
18db0 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
18dc0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
18dd0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
18de0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
18df0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
18e00 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
18e10 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
18e20 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
18e30 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
18e40 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
18e50 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
18e60 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
18e70 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
18e80 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
18e90 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
18ea0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
18eb0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
18ec0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
18ed0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
18ee0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
18ef0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
18f00 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
18f10 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
18f20 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
18f30 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
18f40 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
18f50 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
18f60 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
18f70 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
18f80 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
18f90 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
18fa0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
18fb0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
18fc0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
18fd0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18fe0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
18ff0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
19000 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
19010 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
19020 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
19030 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
19040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
19050 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19060 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
19070 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
19080 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
19090 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
190a0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
190b0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
190c0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
190d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
190e0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
190f0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
19100 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
19120 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
19130 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
19140 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
19150 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
19160 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
19170 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
19180 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19190 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
191a0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
191b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
191c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
191d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
191e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
191f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
19200 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
19210 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
19220 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
19230 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
19240 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
19250 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19260 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
19270 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
19280 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19290 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
192a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
192b0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
192c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
192d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
192e0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
192f0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
19300 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
19310 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
19320 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
19330 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
19340 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
19350 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
19360 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
19370 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
19380 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
19390 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
193a0 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
193b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
193c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
193d0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
193e0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
193f0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
19400 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
19410 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19420 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19430 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19440 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
19450 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
19460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19470 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
19480 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
19490 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
194a0 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
194b0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
194c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
194d0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
194e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
194f0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
19500 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19510 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
19520 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
19530 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
19540 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
19550 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
19560 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
19570 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
19580 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
19590 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
195a0 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
195b0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
195c0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
195d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
195e0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
195f0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
19600 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
19610 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
19620 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
19630 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
19640 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
19650 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
19660 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
19670 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
19680 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
19690 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
196a0 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
196b0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
196c0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
196d0 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
196e0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
196f0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
19700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19710 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
19720 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
19730 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
19740 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
19750 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
19760 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
19770 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
19780 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
19790 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
197a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
197b0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
197c0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
197d0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
197e0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
197f0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
19800 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
19810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19820 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
19830 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19840 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19850 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
19860 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
19870 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
19880 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
19890 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
198a0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
198b0 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
198c0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
198d0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
198e0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
198f0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
19900 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19910 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
19920 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
19930 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
19940 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
19950 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
19960 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19970 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19980 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
19990 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
199a0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
199b0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
199c0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
199d0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
199e0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
199f0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
19a00 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
19a10 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
19a20 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
19a30 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
19a40 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
19a50 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
19a60 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
19a70 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
19a80 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
19a90 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
19aa0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
19ab0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
19ac0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
19ad0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
19ae0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
19af0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
19b00 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
19b10 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
19b20 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
19b30 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
19b40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
19b50 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
19b60 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
19b70 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
19b80 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
19b90 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
19ba0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
19bb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
19bc0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
19bd0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
19be0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
19bf0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
19c00 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
19c10 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
19c20 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19c30 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
19c40 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19c50 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
19c60 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
19c70 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
19c80 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
19c90 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
19ca0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19cb0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
19cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19cd0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
19ce0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
19cf0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
19d00 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
19d10 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
19d20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
19d30 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
19d40 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
19d50 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
19d60 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
19d70 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
19d80 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
19d90 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
19da0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
19db0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
19dc0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
19dd0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
19de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
19df0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
19e00 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
19e10 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
19e20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
19e30 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
19e40 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
19e50 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
19e60 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
19e70 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
19e80 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
19e90 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
19ea0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
19eb0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
19ec0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
19ed0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
19ee0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
19ef0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
19f00 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
19f10 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
19f20 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
19f30 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
19f40 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
19f50 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
19f60 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
19f70 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
19f80 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
19f90 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
19fa0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
19fb0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
19fc0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
19fd0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
19fe0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
19ff0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
1a000 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
1a010 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
1a020 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1a030 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
1a040 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
1a050 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a060 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1a070 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a080 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a090 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1a0a0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1a0b0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
1a0c0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1a0d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a0e0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
1a0f0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
1a100 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1a110 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
1a120 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
1a130 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
1a140 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1a150 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a160 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1a170 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
1a180 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
1a190 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
1a1a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a1b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1a1c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a1d0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
1a1e0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
1a1f0 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
1a200 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
1a210 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1a220 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1a230 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1a240 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1a250 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1a260 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1a270 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1a280 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1a290 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1a2a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a2b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a2c0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1a2d0 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  CHE.  {.    sqli
1a2e0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
1a2f0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  .    /* If anoth
1a300 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1a310 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1a320 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1a330 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
1a340 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
1a350 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
1a360 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
1a370 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1a380 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  is.    ** reques
1a390 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1a3a0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a  TE_LOCKED..    *
1a3b0 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61  /.    if( (wrfla
1a3c0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
1a3d0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1a3e0 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70  RITE).     || (p
1a3f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1a400 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
1a410 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f     ){.      pBlo
1a420 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
1a430 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65  r->db;.    }else
1a440 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1a450 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  .      BtLock *p
1a460 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Iter;.      for(
1a470 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1a480 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1a490 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1a4a0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1a4b0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1a4c0 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
1a4d0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
1a4e0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  db;.          br
1a4f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1a500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a510 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
1a520 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
1a530 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1a540 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1a550 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a560 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1a570 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  HE;.      goto t
1a580 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
1a590 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1a5a0 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
1a5b0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
1a5c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
1a5d0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
1a5e0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
1a5f0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
1a600 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
1a610 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
1a620 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
1a630 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
1a640 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1a650 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
1a660 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
1a670 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1a680 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
1a690 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
1a6a0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1a6b0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
1a6c0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
1a6d0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1a6e0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1a6f0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
1a700 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
1a710 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
1a720 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1a730 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
1a740 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
1a750 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
1a760 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
1a770 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
1a780 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
1a790 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1a7a0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1a7b0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
1a7c0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
1a7d0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1a7e0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1a7f0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
1a800 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
1a810 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
1a820 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
1a830 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1a840 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1a850 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1a860 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1a870 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1a880 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1a890 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1a8a0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1a8b0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1a8c0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1a8d0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1a8e0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1a8f0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1a900 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1a910 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1a920 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1a930 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
1a940 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1a950 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1a960 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1a970 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1a980 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1a990 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a9a0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1a9b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1a9c0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1a9d0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1a9e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1a9f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1aa00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1aa10 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1aa20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1aa30 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1aa40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1aa50 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1aa60 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1aa70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1aa80 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1aa90 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1aaa0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1aab0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1aac0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1aad0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1aae0 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
1aaf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ab00 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1ab10 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1ab20 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1ab30 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1ab40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ab50 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1ab60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1ab70 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1ab80 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1ab90 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1aba0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1abb0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1abc0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1abd0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1abe0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1abf0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1ac00 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1ac10 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1ac20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1ac30 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1ac40 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1ac50 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1ac60 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1ac70 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1ac80 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1ac90 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1aca0 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1acb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1acc0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1acd0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1ace0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1acf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ad00 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1ad10 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1ad20 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1ad30 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1ad40 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1ad50 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1ad60 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1ad70 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1ad80 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1ad90 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1ada0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1adb0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1adc0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1add0 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1ade0 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1adf0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1ae00 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1ae10 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1ae20 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1ae30 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1ae40 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1ae50 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1ae60 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1ae70 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1ae80 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1ae90 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1aea0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1aeb0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1aec0 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1aed0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1aee0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1aef0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1af00 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1af10 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1af20 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1af30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1af40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1af50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1af60 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1af70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1af80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1af90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1afa0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1afb0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1afc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1afd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1afe0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
1aff0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
1b000 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1b010 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1b020 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1b030 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1b040 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1b050 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
1b060 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1b070 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1b080 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1b090 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1b0a0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
1b0b0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
1b0c0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
1b0d0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
1b0e0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1b0f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b100 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1b110 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1b120 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1b130 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1b140 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1b150 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b160 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1b170 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1b180 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b190 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1b1a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1b1b0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1b1c0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1b1d0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1b1e0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1b1f0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1b200 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1b210 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1b220 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1b230 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1b240 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1b250 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1b260 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1b270 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1b280 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
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 2f 2a 20 43 6f 75 6e 74          /* Count
1b2b0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1b2c0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b2f0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1b300 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1b310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b330 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1b340 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b350 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
1b360 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
1b370 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
1b380 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1b390 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1b3a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b3b0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1b3c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1b3d0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1b3e0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1b3f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b400 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
1b410 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
1b420 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
1b430 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1b440 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1b450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
1b460 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1b470 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
1b480 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
1b490 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1b4a0 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
1b4b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1b4c0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
1b4d0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
1b4e0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
1b4f0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1b500 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1b510 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1b520 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1b530 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1b540 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
1b550 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1b560 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1b570 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1b580 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
1b590 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1b5a0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1b5b0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
1b5c0 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
1b5d0 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
1b5e0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1b5f0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
1b600 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
1b610 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
1b620 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1b630 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
1b640 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
1b650 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
1b660 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
1b670 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
1b680 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
1b690 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
1b6a0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
1b6b0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
1b6c0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
1b6d0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
1b6e0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1b6f0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1b700 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1b720 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
1b730 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1b740 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
1b750 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1b760 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1b770 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
1b7a0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
1b7b0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
1b7c0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1b7d0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
1b7e0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
1b7f0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1b800 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
1b810 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
1b820 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
1b830 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
1b840 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b850 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1b860 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
1b870 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
1b880 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
1b890 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
1b8a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b8b0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1b8c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1b8d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1b8e0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
1b8f0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
1b900 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1b910 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
1b920 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
1b930 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
1b940 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
1b950 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
1b960 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
1b970 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
1b980 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
1b990 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b9a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b9b0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
1b9c0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1b9d0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1b9e0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
1b9f0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1ba00 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
1ba10 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1ba20 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1ba30 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
1ba40 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1ba50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1ba60 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  n rc;.    nCell 
1ba70 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1ba80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ba90 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1baa0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1bab0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1bac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
1bad0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1bae0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
1baf0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1bb00 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
1bb10 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
1bb20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1bb30 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
1bb40 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
1bb50 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 26 26  load.         &&
1bb60 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a   pCell+info.nSiz
1bb70 65 2d 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  e-1<=pPage->aDat
1bb80 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
1bb90 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
1bba0 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43  rom==get4byte(pC
1bbb0 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1bbc0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1bbd0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1bbe0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1bbf0 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  -4, iTo);.      
1bc00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bc10 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1bc20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1bc30 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1bc40 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1bc50 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1bc60 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1bc70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1bc80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1bc90 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1bca0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1bcb0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1bcc0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1bcd0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1bce0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1bcf0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1bd00 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1bd10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bd20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1bd30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1bd40 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1bd50 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1bd60 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1bd70 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1bd80 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1bd90 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1bda0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1bdb0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1bdc0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1bdd0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1bde0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1bdf0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1be00 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1be10 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1be20 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1be30 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1be40 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1be50 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1be60 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1be70 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1be80 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1be90 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1bea0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1beb0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1bec0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1bed0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1bee0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1bef0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1bf00 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1bf10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1bf20 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1bf30 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1bf40 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1bf50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1bf60 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1bf70 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1bf80 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1bf90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bfa0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1bfb0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1bfc0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1bfd0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1bfe0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1bff0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1c000 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1c010 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1c020 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1c030 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1c040 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1c050 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1c060 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1c070 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1c080 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1c090 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1c0a0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1c0b0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1c0c0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1c0d0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1c0e0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1c0f0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1c100 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1c110 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c120 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1c130 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1c140 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1c150 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1c160 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c170 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1c180 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1c190 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1c1a0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1c1b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1c1c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c1d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1c1e0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1c1f0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1c200 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1c210 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1c220 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1c230 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1c240 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1c250 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1c260 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1c270 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1c280 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1c290 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1c2a0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1c2b0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1c2c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c2d0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1c2e0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1c2f0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1c300 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1c310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c320 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c330 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1c340 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1c350 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1c360 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1c370 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1c380 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1c390 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1c3a0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1c3b0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c3c0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1c3d0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1c3e0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1c3f0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1c400 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1c410 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1c420 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1c430 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1c440 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1c450 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1c460 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1c470 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1c480 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1c490 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1c4a0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1c4b0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1c4c0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1c4d0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1c4e0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1c4f0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1c500 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1c510 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1c520 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1c530 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1c540 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1c550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c570 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1c580 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1c590 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1c5a0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1c5b0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1c5c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1c5d0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1c5e0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1c5f0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1c600 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1c610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c620 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1c630 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1c640 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1c650 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1c660 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1c670 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1c680 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1c690 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1c6a0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1c6b0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1c6c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1c6d0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1c6e0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1c6f0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1c700 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1c710 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1c720 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1c730 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1c740 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c760 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c780 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1c790 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1c7a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c7b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c7c0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1c7d0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1c7e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c7f0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1c800 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1c810 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1c820 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1c830 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1c840 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1c850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c860 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1c870 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1c880 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1c890 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1c8a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c8b0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1c8c0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1c8d0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1c8e0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1c8f0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1c900 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1c910 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1c920 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1c930 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1c940 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1c950 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1c960 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1c970 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1c980 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1c990 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1c9a0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1c9b0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1c9c0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1c9d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1c9e0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1c9f0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1ca00 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1ca10 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1ca20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1ca30 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1ca40 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1ca50 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1ca60 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1ca70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1ca80 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1ca90 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1caa0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1cab0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1cac0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1cad0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1cae0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1caf0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1cb00 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1cb10 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1cb20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1cb30 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1cb40 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1cb50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1cb60 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1cb70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1cb80 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1cb90 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1cba0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1cbb0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1cbc0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1cbd0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1cbe0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1cbf0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1cc00 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1cc10 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1cc20 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1cc30 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1cc40 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1cc50 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1cc60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1cc70 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1cc80 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1cc90 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1cca0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1ccb0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1ccc0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1ccd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1cce0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1ccf0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1cd00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1cd10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1cd20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1cd30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1cd40 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1cd50 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1cd60 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1cd70 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1cd80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1cd90 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1cda0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1cdb0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1cdc0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1cdd0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1cde0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1cdf0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1ce00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ce10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1ce20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1ce30 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1ce40 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1ce50 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1ce60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ce70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ce80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1ce90 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1cea0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1ceb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cec0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ced0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1cee0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1cef0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1cf00 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1cf10 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1cf20 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1cf30 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1cf40 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1cf50 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1cf60 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1cf70 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1cf80 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1cf90 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1cfa0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1cfb0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1cfc0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1cfd0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1cfe0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1cff0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1d000 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1d010 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1d020 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1d030 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1d040 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1d050 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1d060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1d070 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d080 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1d090 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1d0a0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1d0b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d0c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d0d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d0e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1d0f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1d100 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1d110 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1d120 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1d130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1d140 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1d150 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1d160 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d170 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1d180 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1d190 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1d1a0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1d1b0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1d1c0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1d1d0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d1e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d1f0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1d200 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1d210 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1d220 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1d230 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d240 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1d250 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1d260 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1d270 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1d280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d290 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1d2a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d2b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1d2c0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1d2d0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1d2e0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1d2f0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1d300 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1d310 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1d320 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1d330 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1d340 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d350 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1d360 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1d370 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1d380 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1d390 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1d3a0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1d3b0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1d3c0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1d3d0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1d3e0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1d3f0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1d400 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1d410 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1d420 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1d430 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1d440 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1d450 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1d460 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1d470 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d480 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1d490 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1d4a0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1d4b0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1d4c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d4d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d4e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d4f0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1d500 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d520 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d530 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1d540 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1d550 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1d560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d570 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1d580 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1d590 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1d5a0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1d5b0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1d5c0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1d5d0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1d5e0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1d5f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d610 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d630 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1d640 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1d650 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1d660 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1d670 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1d680 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1d690 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1d6a0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1d6b0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1d6c0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1d6d0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1d6e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d6f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d700 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1d710 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1d720 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1d730 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1d740 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1d750 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1d760 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1d770 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1d780 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1d790 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1d7a0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1d7b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1d7c0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1d7d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1d7e0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1d7f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1d800 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1d810 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1d820 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1d830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d840 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1d850 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1d860 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1d870 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1d880 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d890 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1d8a0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1d8b0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1d8e0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1d8f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1d900 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1d910 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1d920 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1d930 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1d940 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1d950 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1d960 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1d970 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1d980 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1d990 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1d9a0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1d9b0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1d9c0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1d9d0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1d9e0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1d9f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1da00 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1da10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1da20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1da30 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1da40 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1da50 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1da60 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1da70 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1da80 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1da90 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1daa0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1dab0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1dac0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1dad0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1dae0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1daf0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1db00 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1db10 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1db20 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1db30 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1db40 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1db50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1db60 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1db70 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1db80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1db90 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1dba0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1dbb0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1dbc0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1dbd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1dbe0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1dbf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1dc00 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1dc10 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1dc20 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1dc30 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1dc40 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1dc50 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1dc60 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1dc70 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1dc80 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1dc90 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1dca0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1dcb0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1dcc0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1dcd0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1dce0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1dcf0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1dd00 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1dd10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1dd20 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1dd30 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1dd40 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1dd50 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1dd60 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1dd70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dd80 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1dd90 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1dda0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1ddb0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1ddc0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1ddd0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1dde0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1ddf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1de00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1de10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1de20 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1de30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1de40 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1de50 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1de60 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1de70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1de80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1de90 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1dea0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1deb0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1dec0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1ded0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1dee0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1def0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1df00 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1df10 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1df20 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1df30 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1df40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1df50 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1df60 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1df70 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1df80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1df90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dfa0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1dfb0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1dfc0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1dfd0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1dfe0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1dff0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1e000 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1e010 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1e020 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1e030 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1e040 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1e050 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1e060 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1e070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1e080 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e090 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1e0a0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1e0b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e0c0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1e0d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e0e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e0f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1e100 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e110 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e120 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1e130 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1e140 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1e150 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1e160 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1e170 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e180 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1e190 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1e1a0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1e1b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1e1c0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1e1d0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1e1e0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1e1f0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1e200 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1e210 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1e220 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1e230 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e240 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1e250 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1e260 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e270 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e280 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1e290 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1e2a0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1e2b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e2c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1e2d0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1e2e0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1e2f0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1e300 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1e310 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1e320 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1e330 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1e340 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1e350 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1e360 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1e370 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1e380 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1e390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e3a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e3b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1e3c0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1e3d0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e3e0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1e3f0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1e400 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1e410 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1e420 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1e430 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e440 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1e450 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1e460 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1e470 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1e480 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1e490 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1e4a0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1e4b0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1e4c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1e4d0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1e4e0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1e4f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e500 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1e510 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1e520 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1e530 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e540 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e550 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e560 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1e570 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e580 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1e590 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e5a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e5b0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1e5c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e5d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e5e0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1e5f0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1e600 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1e610 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1e620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e640 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e650 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1e660 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1e670 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1e680 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1e690 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1e6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1e6b0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1e6c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e6d0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1e6e0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1e6f0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1e700 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1e710 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1e720 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1e730 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1e740 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1e750 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1e760 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1e770 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1e780 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1e790 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1e7a0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1e7b0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1e7c0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1e7d0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1e7e0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1e7f0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1e800 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1e810 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1e820 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1e830 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1e840 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1e850 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1e860 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1e870 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1e880 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1e890 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1e8a0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1e8b0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1e8c0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1e8d0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1e8e0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1e8f0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1e900 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1e910 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1e920 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1e930 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1e940 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1e950 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1e960 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1e970 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e980 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1e990 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1e9a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1e9b0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1e9c0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1e9d0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1e9e0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1e9f0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1ea00 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1ea10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1ea20 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1ea30 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1ea40 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1ea50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1ea60 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1ea70 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1ea80 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1ea90 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1eaa0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1eab0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1eac0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1ead0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1eae0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1eaf0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1eb00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1eb10 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1eb20 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1eb30 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1eb40 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1eb50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1eb60 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1eb70 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1eb80 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1eb90 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1eba0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1ebb0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1ebc0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1ebd0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1ebe0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1ebf0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1ec00 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1ec10 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1ec20 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1ec30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1ec40 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1ec50 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1ec60 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1ec70 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1ec80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1ec90 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1eca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ecb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1ecc0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1ecd0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1ece0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1ecf0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1ed00 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1ed10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ed20 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1ed30 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1ed40 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1ed50 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1ed60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ed70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ed80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ed90 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1eda0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1edb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1edc0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1edd0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1ede0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1edf0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1ee00 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1ee10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1ee20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ee30 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ee40 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1ee50 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1ee60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ee70 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1ee80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ee90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1eea0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1eeb0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1eec0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1eed0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1eee0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1eef0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1ef00 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1ef10 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1ef20 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1ef30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ef40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1ef50 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1ef60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1ef70 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1ef80 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1ef90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1efa0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1efb0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1efc0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1efd0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1efe0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1eff0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1f000 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1f010 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1f020 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1f030 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1f040 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1f050 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1f060 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1f070 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1f080 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1f090 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1f0a0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1f0b0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1f0c0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1f0d0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f0e0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1f0f0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f100 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1f110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1f120 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1f130 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1f140 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1f150 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1f160 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1f170 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1f180 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1f190 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1f1a0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1f1b0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1f1c0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1f1d0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1f1e0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1f1f0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1f200 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1f210 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1f220 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1f230 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1f240 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1f250 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1f260 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1f270 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1f280 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1f290 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1f2a0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1f2b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1f2c0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1f2d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f2e0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1f2f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1f300 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1f310 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1f320 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1f330 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1f340 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1f350 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1f360 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1f370 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f380 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1f390 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1f3a0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f3b0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1f3c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1f3d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f3e0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1f3f0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1f400 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1f410 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1f420 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1f430 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1f440 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1f450 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1f460 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1f470 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1f480 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1f490 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1f4a0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1f4b0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1f4c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1f4d0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1f4e0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1f4f0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1f500 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1f510 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1f520 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1f530 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1f540 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1f550 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1f560 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1f570 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1f580 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1f590 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1f5a0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1f5b0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1f5c0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1f5d0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1f5e0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1f5f0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1f600 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1f610 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1f620 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1f630 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1f640 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1f650 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1f660 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1f670 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1f680 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1f690 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1f6a0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1f6b0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1f6c0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1f6d0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1f6e0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1f6f0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1f700 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1f710 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1f720 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1f730 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1f740 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1f750 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1f760 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1f770 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1f780 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1f790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1f7a0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1f7b0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1f7c0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1f7d0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1f7e0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1f7f0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1f800 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1f810 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1f820 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1f830 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1f840 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1f850 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1f860 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1f870 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1f880 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1f890 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1f8a0 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1f8b0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1f8c0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1f8d0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1f8e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f8f0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1f900 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1f910 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1f920 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1f930 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1f940 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f950 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1f960 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1f970 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1f980 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1f990 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1f9a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1f9b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1f9c0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1f9d0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1f9e0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1f9f0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1fa00 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1fa10 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1fa20 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1fa30 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1fa40 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1fa50 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1fa60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1fa70 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1fa80 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1fa90 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1faa0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1fab0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1fac0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1fad0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1fae0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1faf0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1fb00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fb10 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1fb20 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1fb30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fb40 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1fb50 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1fb60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1fb70 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1fb80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1fb90 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
1fba0 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
1fbb0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
1fbc0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
1fbd0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1fbe0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1fbf0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1fc00 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1fc10 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1fc20 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1fc30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1fc40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1fc50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fc60 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1fc70 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1fc80 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1fc90 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1fca0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1fcb0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1fcc0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1fcd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1fce0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1fcf0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1fd00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fd10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1fd20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1fd30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1fd40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1fd50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1fd60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1fd70 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1fd80 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1fd90 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1fda0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1fdb0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1fdc0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
1fdd0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1fde0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1fdf0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
1fe00 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
1fe10 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
1fe20 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
1fe30 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
1fe40 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
1fe50 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
1fe60 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1fe70 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
1fe80 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
1fe90 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
1fea0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
1feb0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1fec0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1fed0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
1fee0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
1fef0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1ff00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ff10 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1ff20 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1ff30 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
1ff40 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
1ff50 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
1ff60 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
1ff70 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
1ff80 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1ff90 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
1ffa0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
1ffb0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
1ffc0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
1ffd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
1ffe0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
1fff0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
20000 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
20010 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
20020 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
20030 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
20040 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
20050 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
20060 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
20070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
20080 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
20090 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
200a0 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
200b0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
200c0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
200d0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
200e0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
200f0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
20100 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
20110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
20120 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
20130 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
20140 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20150 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
20160 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
20170 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
20180 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
20190 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
201a0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
201b0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
201c0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
201d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
201e0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
201f0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
20200 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
20210 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
20220 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
20230 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
20240 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20250 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
20260 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
20270 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
20280 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
20290 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
202a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
202b0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
202c0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
202d0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
202e0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
202f0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
20300 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
20310 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
20320 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
20330 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
20340 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
20350 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
20360 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
20370 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
20380 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
20390 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
203a0 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
203b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
203c0 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
203d0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
203e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
203f0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
20400 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
20410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20430 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
20440 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
20450 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
20460 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20470 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20480 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
204a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
204b0 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
204c0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
204d0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
204e0 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
204f0 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
20500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
20510 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
20520 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
20530 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
20540 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
20550 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
20560 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20570 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
20580 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
20590 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
205a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
205b0 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
205c0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
205d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
205e0 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
205f0 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
20600 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
20610 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
20620 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
20630 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
20640 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
20650 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
20660 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
20670 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20680 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
20690 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
206a0 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
206b0 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
206c0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
206d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
206e0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
206f0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
20700 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
20710 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
20720 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
20730 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
20740 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
20750 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20760 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
20770 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
20780 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
20790 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
207a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
207b0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
207c0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
207d0 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
207e0 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
207f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
20800 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20810 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
20820 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
20830 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
20840 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20850 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
20860 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
20870 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
20880 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
20890 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
208a0 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
208b0 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
208c0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
208d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
208e0 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
208f0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
20900 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20910 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
20920 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
20930 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
20940 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
20950 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
20960 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
20970 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
20980 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
20990 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
209a0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
209b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
209c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
209d0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
209e0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
209f0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
20a00 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
20a10 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
20a20 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
20a30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20a40 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
20a50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
20a60 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
20a70 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
20a80 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
20a90 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
20aa0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
20ab0 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
20ac0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
20ad0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
20ae0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
20af0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
20b00 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
20b10 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
20b20 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
20b30 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
20b40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
20b50 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
20b60 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
20b70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
20b80 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
20b90 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
20ba0 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
20bb0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
20bc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
20bd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
20be0 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
20bf0 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
20c00 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
20c10 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
20c20 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
20c30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20c40 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
20c50 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
20c60 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
20c70 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
20c80 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
20c90 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
20ca0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
20cb0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
20cc0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
20cd0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20ce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20cf0 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
20d00 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
20d10 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
20d20 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
20d30 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
20d40 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
20d50 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
20d60 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
20d70 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
20d80 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
20d90 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
20da0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
20db0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
20dc0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
20dd0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
20de0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
20df0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
20e00 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
20e10 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
20e20 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
20e30 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
20e40 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
20e50 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
20e60 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
20e70 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
20e80 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
20e90 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
20ea0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
20eb0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
20ec0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
20ed0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
20ee0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
20ef0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
20f00 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
20f10 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
20f20 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
20f30 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
20f40 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
20f50 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
20f60 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
20f70 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
20f80 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
20f90 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
20fa0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
20fb0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
20fc0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
20fd0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
20fe0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
20ff0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
21000 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
21010 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
21020 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
21030 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
21040 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
21050 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
21060 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
21070 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
21080 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
21090 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
210a0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
210b0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
210c0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
210d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
210e0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
210f0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
21100 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
21110 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21120 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
21130 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
21150 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21160 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
21170 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21180 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
21190 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
211a0 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
211b0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
211c0 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
211d0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
211e0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
211f0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
21200 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
21210 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
21220 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
21230 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
21240 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
21250 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
21260 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
21270 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
21280 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
21290 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
212a0 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
212b0 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
212c0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
212d0 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
212e0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
212f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
21300 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
21310 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
21320 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
21330 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
21340 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21350 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
21360 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21370 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21380 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
21390 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
213a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
213b0 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
213c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
213d0 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
213e0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
213f0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
21400 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
21410 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
21420 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
21430 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
21440 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
21450 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
21460 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
21470 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
21480 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
21490 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
214a0 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
214b0 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
214c0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
214d0 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
214e0 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
214f0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
21500 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
21510 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
21520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
21530 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
21540 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
21550 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
21560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
21570 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
21580 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
21590 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
215a0 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
215b0 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
215c0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
215d0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
215e0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
215f0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
21600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
21610 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
21620 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
21630 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
21640 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
21650 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
21660 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
21670 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
21680 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
21690 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
216a0 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
216b0 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
216c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
216d0 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
216e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
216f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21700 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
21710 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
21720 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
21730 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21740 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
21750 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
21760 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21770 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
21780 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
21790 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
217a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
217b0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
217c0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
217d0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
217e0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
217f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
21800 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
21810 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
21820 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21830 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
21840 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
21850 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
21860 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
21870 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
21880 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
21890 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
218a0 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
218b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
218c0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
218d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
218e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
218f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21900 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
21910 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
21920 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
21930 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
21940 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
21950 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21960 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21970 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
21980 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
21990 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
219a0 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
219b0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
219c0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
219d0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
219e0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
219f0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
21a00 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
21a10 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
21a20 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
21a30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
21a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
21a50 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f  TREE_WRCSR bit o
21a60 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61  f wrFlag is clea
21a70 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
21a80 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62  or can only.** b
21a90 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
21aa0 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45  ng.  If the BTRE
21ab0 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73  E_WRCSR bit is s
21ac0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
21ad0 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  sor.** can be us
21ae0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
21af0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66  r for writing if
21b00 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
21b10 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  s for writing.**
21b20 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
21b30 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f  These are the co
21b40 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
21b50 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
21b60 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e  er.** for writin
21b70 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a  g to be allowed:
21b80 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
21b90 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
21ba0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
21bb0 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69   wrFlag containi
21bc0 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  ng BTREE_WRCSR.*
21bd0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
21be0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21bf0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
21c00 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
21c10 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
21c20 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
21c30 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
21c40 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
21c50 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
21c60 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
21c70 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
21c80 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
21c90 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
21ca0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
21cb0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
21cc0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
21cd0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
21ce0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
21cf0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
21d00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21d10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
21d20 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
21d30 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
21d40 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
21d50 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
21d60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
21d70 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
21d80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  on..**.** The BT
21d90 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69  REE_FORDELETE bi
21da0 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20  t of wrFlag may 
21db0 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65  optionally be se
21dc0 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52  t if BTREE_WRCSR
21dd0 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20  .** is set.  If 
21de0 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74  FORDELETE is set
21df0 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
21e00 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
21e10 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74  tation that.** t
21e20 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  his cursor will 
21e30 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20  only be used to 
21e40 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65  seek to and dele
21e50 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e  te entries of an
21e60 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72   index.** as par
21e70 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45  t of a larger DE
21e80 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
21e90 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68   The FORDELETE h
21ea0 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  int is not used 
21eb0 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65  by.** this imple
21ec0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
21ed0 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61  in a hypothetica
21ee0 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74  l alternative st
21ef0 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a  orage engine .**
21f00 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   in which index 
21f10 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f  entries are auto
21f20 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
21f30 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e  d when correspon
21f40 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  ding table.** ro
21f50 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ws are deleted, 
21f60 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c  the FORDELETE fl
21f70 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61  ag is a hint tha
21f80 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44  t all SEEK and D
21f90 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69  ELETE.** operati
21fa0 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73  ons on this curs
21fb0 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73  or can be no-ops
21fc0 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70   and all READ op
21fd0 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a  erations can .**
21fe0 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72   return a null r
21ff0 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30  ow (2-bytes: 0x0
22000 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e  1 0x00)..**.** N
22010 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
22020 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
22030 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
22040 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
22050 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
22060 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
22070 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
22080 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
22090 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
220a0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
220b0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
220c0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
220d0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
220e0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
220f0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
22100 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
22110 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
22120 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
22130 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
22140 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
22150 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
22160 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
22190 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
221c0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
221d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
221e0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22200 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
22210 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
22220 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
22230 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
22240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22250 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
22260 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
22270 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
22280 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
22290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
222a0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
222b0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
222c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
222d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
222e0 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
222f0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
22300 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
22330 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
22340 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
22350 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
22360 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
22370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22380 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
22390 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
223a0 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
223b0 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
223c0 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
223d0 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
223e0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
223f0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
22400 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
22410 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
22420 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
22430 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
22440 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
22450 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
22460 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
22470 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
22480 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
22490 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
224a0 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
224b0 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
224c0 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
224d0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
224e0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
224f0 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
22500 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
22510 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
22520 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22530 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
22540 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
22550 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
22560 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
22570 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
22580 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
22590 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
225a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
225b0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
225c0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
225d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
225e0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
225f0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
22600 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
22610 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
22620 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22630 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
22640 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
22650 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
22660 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
22670 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
22680 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
22690 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
226a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
226b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
226c0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
226d0 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
226e0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
226f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22700 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
22710 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
22720 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
22730 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
22740 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
22750 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
22760 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
22770 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
22780 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
22790 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
227a0 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
227b0 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
227c0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
227d0 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
227e0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
227f0 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
22800 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
22810 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
22820 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
22830 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65  lag ? BTCF_Write
22840 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72  Flag : 0;.  pCur
22850 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
22860 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
22870 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
22880 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
22890 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
228a0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
228b0 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
228c0 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
228d0 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
228e0 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
228f0 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
22900 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
22910 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
22920 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
22930 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
22940 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
22950 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
22960 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
22970 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
22980 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
22990 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
229a0 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
229b0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
229c0 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
229d0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
229e0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
229f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
22a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22a10 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
22a20 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
22a30 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22a60 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
22a70 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
22aa0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
22ab0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
22ac0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ae0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
22af0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
22b00 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
22b10 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b30 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
22b40 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
22b50 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22b60 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b80 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
22b90 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
22ba0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
22bb0 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
22bc0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
22bd0 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
22be0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22bf0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
22c00 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
22c10 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
22c20 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
22c30 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
22c40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22c50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22c60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22c70 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
22c80 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
22c90 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
22ca0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
22cb0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
22cc0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
22cd0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
22ce0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
22cf0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
22d00 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
22d10 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
22d20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
22d30 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
22d40 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
22d50 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
22d60 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
22d70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
22d80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22d90 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
22da0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
22db0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
22dc0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
22dd0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
22de0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
22df0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
22e00 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
22e10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
22e20 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
22e30 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
22e40 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
22e50 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
22e60 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
22e70 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
22e80 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
22e90 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
22ea0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
22eb0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
22ec0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
22ed0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
22ee0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
22ef0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
22f00 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
22f10 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
22f20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
22f30 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
22f40 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
22f50 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
22f60 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
22f70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
22f80 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
22f90 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
22fa0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22fb0 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
22fc0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
22fd0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
22fe0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
22ff0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
23000 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
23010 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
23020 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
23030 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
23040 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23050 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
23060 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
23070 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
23080 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
23090 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
230a0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
230b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
230c0 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
230d0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
230e0 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
230f0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
23100 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
23110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23120 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
23130 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
23140 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
23150 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
23160 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
23170 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
23180 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
23190 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
231a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
231b0 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
231c0 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
231d0 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
231e0 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
231f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
23200 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
23210 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
23220 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
23230 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
23240 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
23250 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
23260 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
23270 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
23280 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
23290 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
232a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
232b0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
232c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
232d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
232e0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
232f0 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
23300 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
23310 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
23320 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
23330 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
23340 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
23350 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
23360 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
23370 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
23380 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
23390 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
233a0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
233b0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
233c0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
233d0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
233e0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
233f0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23400 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
23410 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
23420 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
23430 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
23440 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
23450 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
23460 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
23470 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
23480 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
23490 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
234a0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
234b0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
234c0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
234d0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
234e0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
234f0 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
23500 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
23510 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
23520 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
23530 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
23540 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
23550 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
23560 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
23570 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
23580 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
23590 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
235a0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
235b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
235c0 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75  ge;.    pCur->cu
235d0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
235e0 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
235f0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
23600 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
23610 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
23620 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
23630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
23640 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
23650 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
23660 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
23670 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
23680 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
23690 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
236a0 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
236b0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
236c0 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
236d0 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
236e0 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
236f0 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
23700 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
23710 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
23720 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
23730 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
23740 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
23750 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
23760 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
23770 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
23780 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
23790 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
237a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
237b0 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
237c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
237d0 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
237e0 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
237f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
23800 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
23810 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
23820 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
23830 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
23840 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
23850 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
23860 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
23870 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
23880 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
23890 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
238a0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
238b0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
238c0 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
238d0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
238e0 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
238f0 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
23900 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
23910 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
23920 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
23930 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
23940 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
23950 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
23960 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
23970 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
23980 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
23990 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
239a0 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
239b0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
239c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
239d0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
239e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
239f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23a00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23a10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23a20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
23a30 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
23a40 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
23a50 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74  info.nKey;.  ret
23a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23a70 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
23a80 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
23a90 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
23aa0 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
23ab0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
23ac0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
23ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23ae0 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
23af0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
23b00 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
23b10 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
23b20 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
23b30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
23b40 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
23b50 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
23b60 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
23b70 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
23b80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23b90 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
23ba0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
23bb0 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
23bc0 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
23bd0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
23be0 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
23bf0 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
23c00 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
23c10 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
23c20 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
23c30 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
23c40 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
23c50 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
23c60 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
23c70 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
23c80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
23c90 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
23ca0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
23cb0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
23cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23cd0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23ce0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
23cf0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
23d00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23d10 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
23d20 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
23d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23d40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23d50 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61  Page]->intKeyLea
23d60 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c  f==1 );.  getCel
23d70 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
23d80 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
23d90 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72  fo.nPayload;.  r
23da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
23dc0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
23dd0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
23de0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
23df0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
23e00 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
23e10 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
23e20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
23e30 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
23e40 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
23e50 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
23e60 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
23e70 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
23e80 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
23e90 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
23ea0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
23eb0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
23ec0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
23ed0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
23ee0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23ef0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
23f00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
23f10 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
23f20 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
23f30 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
23f40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
23f50 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
23f60 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
23f70 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
23f80 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
23f90 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
23fa0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
23fb0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
23fc0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
23fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
23fe0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
23ff0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
24000 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
24010 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
24020 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
24030 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
24040 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
24050 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
24060 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
24070 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
24080 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
24090 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
240a0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
240b0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
240c0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
240d0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
240e0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
240f0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
24100 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
24110 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
24120 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
24130 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
24140 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
24150 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
24160 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
24170 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
24180 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
24190 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
241a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
241b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
241c0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
241d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
241e0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
241f0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
24200 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
24210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24220 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
24230 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
24240 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
24250 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
24260 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
24270 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
24280 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
24290 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
242a0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
242b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
242c0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
242d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
242e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
242f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
24300 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
24310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24320 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
24330 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
24340 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
24350 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
24360 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
24370 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
24380 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
24390 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
243a0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
243b0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
243c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
243d0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
243e0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
243f0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
24400 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
24410 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
24420 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
24430 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
24440 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
24450 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
24460 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
24470 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
24480 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
24490 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
244a0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
244b0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
244c0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
244d0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
244e0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
244f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
24500 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
24510 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
24520 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
24530 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
24540 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
24550 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
24560 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
24570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24580 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
24590 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
245a0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
245b0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
245c0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
245d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
245e0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
245f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
24600 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
24610 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
24620 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
24630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24640 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
24650 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
24660 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
24670 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
24680 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
24690 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
246a0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
246b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
246c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
246d0 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
246e0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
246f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
24700 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
24710 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
24720 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
24730 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
24740 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
24750 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
24760 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
24770 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
24780 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
24790 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
247a0 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
247b0 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
247c0 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
247d0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
247e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
247f0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
24800 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
24810 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
24820 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
24830 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
24840 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
24850 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
24860 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
24870 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
24880 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
24890 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
248a0 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
248b0 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
248c0 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
248d0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
248e0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
248f0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
24900 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
24910 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
24920 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
24930 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
24940 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
24950 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
24960 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
24970 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
24980 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
24990 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
249a0 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
249b0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
249c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
249d0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
249e0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
249f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24a00 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
24a10 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
24a40 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
24a50 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
24a60 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
24a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
24a80 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
24a90 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
24aa0 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
24ab0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
24ac0 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
24ad0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
24ae0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
24af0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24b00 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
24b10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
24b30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24b40 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
24b50 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
24b60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24b70 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24b80 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
24b90 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
24ba0 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
24bb0 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
24bc0 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
24bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24be0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24bf0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
24c00 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
24c10 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
24c20 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
24c30 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
24c40 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
24c50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
24c60 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
24c70 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
24c80 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
24c90 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
24ca0 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
24cb0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24cc0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24cd0 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
24ce0 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
24cf0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
24d00 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
24d10 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69    2: The operati
24d20 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f  on is a read. Do
24d30 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
24d40 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24d50 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
24d60 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
24d70 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
24d80 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
24d90 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
24da0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
24db0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
24dc0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
24dd0 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
24de0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
24df0 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
24e00 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
24e10 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
24e20 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
24e30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
24e40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
24e50 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
24e60 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
24e70 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
24e80 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20   and the.** eOp 
24e90 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
24ea0 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  2, this function
24eb0 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
24ec0 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
24ed0 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73  ly .** populates
24ee0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
24ef0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
24f00 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
24f10 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
24f20 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
24f30 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
24f40 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
24f50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
24f60 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
24f70 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
24f80 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
24f90 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
24fa0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
24fb0 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
24fc0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
24fd0 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
24fe0 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
24ff0 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
25000 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
25010 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
25020 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
25030 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
25040 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
25050 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
25060 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
25070 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
25080 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
25090 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
250a0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
250b0 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
250c0 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
250d0 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
250e0 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
250f0 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
25100 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
25110 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
25120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
25130 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
25140 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
25150 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
25160 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
25170 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
25180 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
25190 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
251a0 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
251b0 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
251c0 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
251d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
251e0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
251f0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
25200 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
25210 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
25220 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
25230 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
25240 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
25250 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
25260 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
25270 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
25280 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
25290 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
252a0 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  OK;.  int iIdx =
252b0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
252c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
252d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
252e0 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
252f0 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
25300 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
25310 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
25340 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
25350 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
25360 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
25370 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e  OW_READ.  unsign
25380 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
25390 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66  pBufStart = pBuf
253a0 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20  ;.  int bEnd;   
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
253d0 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
253e0 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20   to end of data 
253f0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
25400 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
25410 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25420 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25430 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
25440 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25450 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
25460 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
25470 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25480 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25490 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c  ssert( eOp!=2 ||
254a0 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20   offset==0 );   
254b0 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74   /* Always start
254c0 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
254d0 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20  for eOp==2 */.. 
254e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
254f0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
25500 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
25510 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c  load;.#ifdef SQL
25520 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
25530 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
25540 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43  = offset+amt==pC
25550 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
25560 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  d;.#endif.  asse
25570 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
25580 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
25590 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20  yload );..  if( 
255a0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
255b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
255c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
255d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
255e0 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
255f0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
25600 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
25610 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
25620 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
25630 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25640 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
25650 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
25660 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
25670 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
25680 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
25690 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
256a0 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
256b0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
256c0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
256d0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
256e0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
256f0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
25700 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
25710 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
25720 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
25730 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
25740 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  t], pBuf, a, (eO
25750 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65  p & 0x01), pPage
25760 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
25770 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
25780 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
25790 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
257a0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
257b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
257c0 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  l;.  }...  if( r
257d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
257e0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
257f0 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
25800 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
25810 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
25820 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
25830 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
25840 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
25850 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
25860 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
25870 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25880 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
25890 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
258a0 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
258b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
258c0 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
258d0 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
258e0 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   do not allocate
258f0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72   aOverflow[] for
25900 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a   eOp==2..    **.
25910 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
25920 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
25930 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
25940 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
25950 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
25960 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
25970 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
25980 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
25990 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
259a0 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
259b0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
259c0 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
259d0 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
259e0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
259f0 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
25a00 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
25a10 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
25a20 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
25a30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
25a40 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75  !=2 && (pCur->cu
25a50 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
25a60 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
25a70 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
25a80 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
25a90 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
25aa0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
25ab0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
25ac0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
25ad0 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
25ae0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
25af0 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
25b00 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
25b10 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
25b20 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
25b30 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
25b40 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
25b50 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
25b60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25b70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25b80 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
25b90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
25ba0 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20  r->nOvflAlloc = 
25bb0 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20  nOvfl*2;.       
25bc0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
25bd0 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ow = aNew;.     
25be0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25bf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25c10 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
25c20 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
25c30 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
25c40 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
25c50 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
25c60 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
25c70 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
25c80 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
25c90 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
25ca0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
25cb0 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
25cc0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
25cd0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
25ce0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
25cf0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
25d00 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
25d10 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
25d20 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
25d30 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
25d40 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  fl)!=0.     && p
25d50 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
25d60 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a  ffset/ovflSize].
25d70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64      ){.      iId
25d80 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
25d90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
25da0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
25db0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
25dc0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
25dd0 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
25de0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
25df0 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
25e00 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
25e10 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
25e20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
25e30 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
25e40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
25e50 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
25e60 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72  .      if( (pCur
25e70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25e80 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20  F_ValidOvfl)!=0 
25e90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
25ea0 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
25eb0 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
25ed0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
25ee0 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20  Idx]==nextPage. 
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
25f00 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
25f10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
25f20 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
25f30 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
25f40 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  }..      if( off
25f50 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
25f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
25f70 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
25f80 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
25f90 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
25fa0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
25fb0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
25fc0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
25fd0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
25fe0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
25ff0 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
26000 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
26010 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
26020 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
26030 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
26040 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
26050 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
26060 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
26070 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
26080 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
26090 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
260a0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
260b0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
260c0 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ray must be allo
260d0 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f  cated because eO
260e0 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  p!=2.        ** 
260f0 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32  here.  If eOp==2
26100 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30  , then offset==0
26110 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68   and this branch
26120 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e   is never taken.
26130 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26140 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21      assert( eOp!
26150 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =2 );.        as
26160 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
26170 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
26180 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
26190 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
261a0 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e  Btree->db==pBt->
261b0 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db );.        if
261c0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
261d0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
261e0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
261f0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
26200 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
26210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26220 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
26230 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
26240 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
26250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
26260 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
26270 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
26280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26290 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
262a0 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
262b0 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
262c0 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
262d0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
262e0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
262f0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
26300 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
26310 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
26320 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26330 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26340 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
26350 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
26360 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
26370 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
26380 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
26390 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
263a0 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
263b0 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
263c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
263d0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
263e0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
263f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
26400 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
26410 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
26420 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26430 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
26440 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
26450 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
26460 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
26470 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
26480 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
26490 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
264a0 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
264b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
264c0 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
264d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
264e0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
264f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
26500 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
26510 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
26520 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
26530 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
26540 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20      **   6) all 
26550 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61  data from the pa
26560 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  ge is being read
26570 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37  ..        **   7
26580 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
26590 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
265a0 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
265b0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
265c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
265d0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
265e0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
265f0 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
26600 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
26610 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
26620 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
26630 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
26640 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
26650 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
26660 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
26670 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
26680 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
26690 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
266a0 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
266b0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
266c0 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20  &0x01)==0       
266d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
266f0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
26700 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26730 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
26740 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62  /.         && (b
26750 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69  End || a==ovflSi
26760 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ze)             
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26780 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
26790 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
267a0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
267b0 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
267c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
267d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
267e0 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
267f0 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
26800 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
26810 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
26820 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
26830 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
26840 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
26850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26860 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  5) */.         &
26870 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75  & &pBuf[-4]>=pBu
26880 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20  fStart          
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20       /* (7) */. 
268b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
268c0 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
268d0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
268e0 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
268f0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
26900 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
26910 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26930 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a    /* hence (7) *
26940 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
26950 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
26960 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26970 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
26980 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
26990 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
269a0 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
269b0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
269c0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
269d0 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
269e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
269f0 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
26a00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
26a10 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
26a20 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
26a30 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
26a40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26a50 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
26a60 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
26a70 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
26a80 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
26a90 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
26aa0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26ab0 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
26ac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26ae0 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
26af0 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
26b00 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
26b10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26b20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
26b30 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
26b40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26b50 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
26b60 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
26b70 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
26b80 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
26b90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26ba0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
26bb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26bc0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
26bd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
26bf0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
26c00 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
26c10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
26c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26c30 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
26c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26c60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26c70 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
26c80 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
26c90 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
26ca0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
26cb0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
26cc0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
26cd0 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
26ce0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
26cf0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
26d00 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
26d10 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
26d20 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
26d30 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
26d40 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
26d50 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
26d60 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26d70 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
26d80 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
26d90 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
26da0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
26db0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
26dc0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
26dd0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
26de0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
26df0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
26e00 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
26e10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
26e20 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
26e30 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
26e40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26e50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26e60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
26e70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26e80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26e90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
26ea0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
26eb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26ec0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
26ed0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26ee0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
26ef0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26f00 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
26f10 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
26f20 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
26f30 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
26f40 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
26f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
26f60 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
26f70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26f80 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
26f90 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
26fa0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
26fb0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
26fc0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
26fd0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
26fe0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
26ff0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27000 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
27010 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
27020 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
27030 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
27040 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
27050 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
27060 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
27070 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
27080 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
27090 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
270a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
270b0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
270c0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
270d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
270e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
270f0 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
27100 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27110 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
27120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27130 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
27140 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
27150 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
27160 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
27170 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
27180 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
27190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
271a0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
271b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
271c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
271d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
271e0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
271f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27200 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
27210 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27220 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27230 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27240 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27250 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
27260 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
27270 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
27280 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
27290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
272a0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
272b0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
272c0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
272d0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
272e0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
272f0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
27300 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
27310 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
27320 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
27330 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
27340 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
27350 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
27360 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
27370 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
27380 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
27390 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
273a0 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
273b0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
273c0 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
273d0 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
273e0 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
273f0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
27400 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
27410 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
27420 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
27430 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
27440 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
27450 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
27460 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
27470 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
27480 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
27490 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
274a0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
274b0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
274c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
274d0 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
274e0 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
274f0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
27500 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
27510 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
27520 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
27530 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
27540 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
27550 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
27560 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
27570 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
27580 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
27590 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
275a0 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
275b0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
275c0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
275d0 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
275e0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
275f0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
27600 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
27610 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
27620 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
27630 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
27640 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
27650 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
27660 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
27670 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
27680 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
27690 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
276a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
276b0 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
276c0 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
276d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
276e0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
276f0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
27700 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33   here */.){.  u3
27710 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28  2 amt;.  assert(
27720 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
27730 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
27740 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27750 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
27760 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27770 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27780 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
27790 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
277a0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
277b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
277c0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
277d0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
277e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
277f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27800 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
27810 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
27820 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
27830 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
27840 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ze>0 );.  assert
27850 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
27860 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61  yload>pCur->apPa
27870 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27880 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50  >aData || CORRUP
27890 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
278a0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
278b0 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61  yload<pCur->apPa
278c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
278d0 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52  >aDataEnd ||CORR
278e0 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d  UPT_DB);.  amt =
278f0 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50   (int)(pCur->apP
27900 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27910 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75  ->aDataEnd - pCu
27920 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27930 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
27940 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29  nfo.nLocal<amt )
27950 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66   amt = pCur->inf
27960 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d  o.nLocal;.  *pAm
27970 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72  t = amt;.  retur
27980 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69  n (void*)pCur->i
27990 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.pPayload;.}.
279a0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
279b0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
279c0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
279d0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
279e0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
279f0 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
27a00 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
27a10 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
27a20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
27a30 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
27a40 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
27a50 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
27a60 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
27a70 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
27a80 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
27a90 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
27aa0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
27ab0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
27ac0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
27ad0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
27ae0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
27af0 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
27b00 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
27b10 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
27b20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
27b30 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
27b40 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
27b50 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
27b60 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
27b70 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
27b80 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
27b90 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
27ba0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
27bb0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
27bc0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
27bd0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
27be0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
27bf0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
27c00 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
27c10 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
27c20 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
27c30 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
27c40 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  mt);.}.const voi
27c50 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
27c60 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
27c70 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
27c80 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
27c90 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
27ca0 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
27cb0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
27cc0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
27cd0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
27ce0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
27cf0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
27d00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
27d10 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
27d20 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
27d30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
27d40 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
27d50 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
27d60 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
27d70 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
27d80 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
27d90 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
27da0 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
27db0 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
27dc0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
27dd0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
27de0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
27df0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
27e00 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
27e10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
27e20 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
27e30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27e40 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53   newPgno){.  BtS
27e50 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
27e60 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
27e70 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27e80 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
27e90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27ea0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27eb0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
27ec0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
27ed0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
27ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27ef0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
27f00 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
27f10 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
27f20 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
27f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27f40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
27f50 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
27f60 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
27f70 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
27f80 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
27f90 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
27fa0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20  pCur->iPage++;. 
27fb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27fc0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20  r->iPage] = 0;. 
27fd0 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
27fe0 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
27ff0 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  gno, &pCur->apPa
28000 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  ge[pCur->iPage],
28010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28020 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20 70           pCur, p
28030 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
28040 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  gs);.}..#if SQLI
28050 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
28060 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
28070 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
28080 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
28090 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
280a0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
280b0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
280c0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
280d0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
280e0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
280f0 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
28100 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
28110 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
28120 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
28130 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
28140 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
28150 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
28160 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
28170 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
28180 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
28190 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
281a0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
281b0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
281c0 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50  d){.  if( CORRUP
281d0 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20  T_DB ) return;  
281e0 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
281f0 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d  s tested below m
28200 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65  ight not be true
28210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
28230 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
28240 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  abase */.  asser
28250 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
28260 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
28270 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
28280 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
28290 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
282a0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
282b0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
282c0 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
282d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
282e0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
282f0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
28300 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
28310 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
28320 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
28330 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
28340 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
28350 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28360 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
28370 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
28380 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
28390 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
283a0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
283b0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
283c0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
283d0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
283e0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
283f0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
28400 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
28410 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
28420 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
28430 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
28440 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
28450 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
28460 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
28470 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28480 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28490 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
284a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
284b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
284c0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
284d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
284e0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
284f0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
28500 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
28510 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
28520 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
28530 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28540 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
28550 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28560 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
28570 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28580 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
28590 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75  .  testcase( pCu
285a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
285b0 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e  Page-1] > pCur->
285c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
285d0 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  ge-1]->nCell );.
285e0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
285f0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
28600 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
28610 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
28620 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
28630 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
28640 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
28650 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
28660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
28670 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
28680 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
28690 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
286a0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
286b0 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
286c0 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
286d0 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
286e0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
286f0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
28700 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
28710 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
28720 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
28730 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
28740 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
28750 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
28760 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
28770 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
28780 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
28790 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
287a0 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
287b0 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
287c0 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
287d0 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
287e0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
287f0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
28800 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
28810 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
28820 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
28830 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
28840 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
28850 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
28860 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
28870 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
28880 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
28890 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
288a0 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
288b0 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
288c0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
288d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
288e0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
288f0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
28900 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
28910 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
28920 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
28930 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
28940 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
28950 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
28960 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
28970 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
28980 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
28990 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
289a0 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
289b0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
289c0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
289d0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
289e0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
289f0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
28a00 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
28a10 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
28a20 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
28a30 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
28a40 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
28a50 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
28a60 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
28a70 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
28a80 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
28a90 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
28aa0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28ab0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
28ac0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28ad0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
28ae0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
28af0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
28b00 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
28b10 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
28b20 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
28b30 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
28b40 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
28b50 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
28b60 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
28b70 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
28b80 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
28b90 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
28ba0 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
28bb0 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
28bc0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
28bd0 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
28be0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28bf0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
28c00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
28c10 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
28c20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
28c30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
28c40 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
28c50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
28c60 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
28c70 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
28c80 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
28c90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
28ca0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28cb0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  ]!=0 );.      re
28cc0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
28cd0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
28ce0 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20  ur->iPage--]);. 
28cf0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
28d00 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
28d10 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
28d20 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28d30 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
28d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
28d60 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
28d70 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20  =(-1) );.    rc 
28d80 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
28d90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
28da0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
28db0 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
28dc0 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
28de0 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
28df0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
28e00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28e10 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
28e20 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
28e30 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
28e40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28e50 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
28e60 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e  .    pCur->curIn
28e70 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50  tKey = pCur->apP
28e80 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a  age[0]->intKey;.
28e90 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
28ea0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
28eb0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
28ec0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
28ed0 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Root );..  /* If
28ee0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
28ef0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
28f00 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
28f10 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
28f20 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74  rsor.  ** expect
28f30 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
28f40 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
28f50 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
28f60 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a  pKeyInfo is.  **
28f70 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
28f80 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
28f90 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
28fa0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
28fb0 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  e,.  ** return a
28fc0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28fd0 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20   error. .  **.  
28fe0 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ** Earlier versi
28ff0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73  ons of SQLite as
29000 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20  sumed that this 
29010 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66  test could not f
29020 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ail.  ** if the 
29030 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c  root page was al
29040 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65  ready loaded whe
29050 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
29060 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e  was called (i.e.
29070 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69  .  ** if pCur->i
29080 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68  Page>=0). But th
29090 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20  is is not so if 
290a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
290b0 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20  corrupted .  ** 
290c0 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
290d0 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73  at page pRoot is
290e0 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73   linked into a s
290f0 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62  econd b-tree tab
29100 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65  le .  ** (or the
29110 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a   freelist).  */.
29120 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
29130 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52  >intKey==1 || pR
29140 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  oot->intKey==0 )
29150 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69  ;.  if( pRoot->i
29160 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75  sInit==0 || (pCu
29170 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
29180 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
29190 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
291a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
291b0 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61  ;.  }..  pCur->a
291c0 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
291d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
291e0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
291f0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
29200 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
29210 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
29220 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52  Ovfl);..  if( pR
29230 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
29240 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29250 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
29260 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
29270 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
29280 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
29290 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
292a0 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
292b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
292c0 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
292d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
292e0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
292f0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
29300 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29310 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
29320 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
29330 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
29340 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
29350 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29360 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
29370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
29390 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
293a0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
293b0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
293c0 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
293d0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
293e0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
293f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
29400 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
29410 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
29420 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
29430 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
29440 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
29450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
29460 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
29470 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
29480 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
29490 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
294a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
294b0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
294c0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
294d0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
294e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
294f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29500 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
29510 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
29520 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
29530 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29540 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
29550 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
29560 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
29570 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
29580 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
29590 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
295a0 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
295b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
295c0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
295d0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
295e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
295f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
29600 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
29610 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
29620 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
29630 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
29640 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
29650 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
29660 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
29670 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
29680 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
29690 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
296a0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
296b0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
296c0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
296d0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
296e0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
296f0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
29700 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
29710 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
29720 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
29730 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
29740 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
29750 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
29760 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
29770 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
29780 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
29790 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
297a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
297b0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
297c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
297d0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
297e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
297f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
29800 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
29810 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
29820 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29840 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29850 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
29860 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
29870 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29880 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
29890 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
298a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
298b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
298c0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
298d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
298e0 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
298f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
29900 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
29910 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
29920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
29930 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29940 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
29950 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
29960 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29970 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
29980 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
29990 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
299a0 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
299b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
299c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
299d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
299e0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
299f0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
29a00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
29a10 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
29a20 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
29a30 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
29a40 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
29a50 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
29a60 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
29a70 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
29a80 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
29a90 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
29aa0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
29ab0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
29ac0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29ad0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29ae0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29af0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29b00 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
29b10 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
29b20 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
29b30 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
29b40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29b50 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
29b60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
29b70 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
29b80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
29b90 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
29ba0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29bb0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
29bc0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
29bd0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
29be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29bf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29c00 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
29c10 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
29c20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
29c30 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
29c40 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
29c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29c60 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29c70 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
29c80 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
29c90 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
29ca0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
29cb0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
29cc0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
29cd0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
29ce0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
29cf0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
29d00 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
29d10 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
29d20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
29d30 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
29d40 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
29d50 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
29d60 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29d70 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29d80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29d90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
29da0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
29db0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
29dc0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
29dd0 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
29de0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
29df0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
29e00 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
29e10 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
29e20 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63  tate && (pCur->c
29e30 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
29e40 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66  tLast)!=0 ){.#if
29e50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
29e60 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
29e70 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
29e80 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
29e90 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
29ea0 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
29eb0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
29ec0 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
29ed0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
29ee0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
29ef0 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
29f00 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
29f10 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
29f20 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
29f30 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
29f40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
29f50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29f60 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
29f70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29f80 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
29f90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29fa0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29fb0 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
29fc0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
29fd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29fe0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
29ff0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2a000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a010 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
2a020 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2a030 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2a040 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2a050 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2a060 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a070 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2a080 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2a090 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2a0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a0b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a0c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
2a0d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2a0e0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2a0f0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2a100 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a120 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2a130 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
2a140 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a150 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2a160 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
2a170 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Last;.      }.  
2a180 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
2a190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2a1a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
2a1b0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2a1c0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
2a1d0 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
2a1e0 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
2a1f0 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
2a200 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
2a210 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
2a220 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
2a230 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
2a240 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
2a250 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
2a260 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
2a270 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
2a280 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
2a290 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
2a2a0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
2a2b0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
2a2c0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
2a2d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2a2e0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
2a2f0 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
2a300 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
2a310 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
2a320 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
2a330 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
2a340 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
2a350 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
2a360 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
2a370 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
2a380 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
2a390 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
2a3a0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
2a3b0 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
2a3c0 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
2a3d0 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
2a3e0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
2a3f0 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
2a400 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
2a410 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
2a420 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
2a430 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
2a440 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2a450 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
2a460 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a470 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2a480 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2a490 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a4a0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
2a4b0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2a4c0 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
2a4d0 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2a4f0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
2a500 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
2a510 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
2a520 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
2a530 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
2a540 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2a550 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2a560 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2a570 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
2a580 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
2a590 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2a5a0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
2a5b0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2a5c0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2a5d0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
2a600 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2a610 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
2a620 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64   tables, the pId
2a630 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65  xKey->eqSeen fie
2a640 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69  ld is set to 1 i
2a650 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74  f there.** exist
2a660 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  s an entry in th
2a670 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61  e table that exa
2a680 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64  ctly matches pId
2a690 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  xKey.  .*/.int s
2a6a0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2a6b0 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
2a6c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2a6d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
2a6e0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
2a6f0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
2a700 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
2a710 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
2a720 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
2a730 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
2a740 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
2a750 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
2a760 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
2a770 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
2a780 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
2a790 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
2a7a0 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
2a7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2a7c0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
2a7d0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
2a7e0 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64  int rc;.  Record
2a7f0 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43  Compare xRecordC
2a800 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72  ompare;..  asser
2a810 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a820 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a830 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a840 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a850 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a860 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2a870 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
2a880 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
2a890 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
2a8a0 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
2a8b0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2a8c0 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
2a8d0 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
2a8e0 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
2a8f0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
2a900 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2a910 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2a920 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
2a930 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a940 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2a950 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2a960 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2a970 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 63  =0.   && pCur->c
2a980 75 72 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  urIntKey .  ){. 
2a990 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2a9a0 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
2a9b0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2a9c0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
2a9d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2a9e0 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
2a9f0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2aa00 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43  AtLast)!=0 && pC
2aa10 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
2aa20 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
2aa30 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2aa40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2aa50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
2aa60 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
2aa70 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2aa80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69   = sqlite3VdbeFi
2aa90 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65  ndCompare(pIdxKe
2aaa0 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d  y);.    pIdxKey-
2aab0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
2aac0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
2aad0 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31  y->default_rc==1
2aae0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2aaf0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2ab00 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  c==0 .         |
2ab10 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2ab20 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b  lt_rc==-1.    );
2ab30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52  .  }else{.    xR
2ab40 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30  ecordCompare = 0
2ab50 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72  ; /* All keys ar
2ab60 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20  e integers */.  
2ab70 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2ab80 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2ab90 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2aba0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2abb0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2abc0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2abd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2abe0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
2abf0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2ac00 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2ac10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2ac20 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
2ac30 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ac40 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2ac50 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
2ac60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2ac70 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
2ac80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ac90 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
2aca0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
2acb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2acc0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2acd0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2ace0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2acf0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
2ad00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ad10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
2ad20 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
2ad30 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49  tKey==pCur->curI
2ad40 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  ntKey );.  asser
2ad50 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
2ad60 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
2ad70 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
2ad80 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
2ad90 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
2ada0 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
2adb0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2adc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2add0 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70  Page];.    u8 *p
2ade0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae00 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
2ae10 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
2ae20 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
2ae30 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
2ae40 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2ae50 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
2ae60 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
2ae70 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
2ae80 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
2ae90 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
2aea0 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
2aeb0 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
2aec0 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
2aed0 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
2aee0 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
2aef0 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
2af00 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
2af10 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
2af20 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
2af30 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
2af40 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
2af50 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
2af60 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
2af70 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
2af80 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
2af90 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
2afa0 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
2afb0 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
2afc0 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
2afd0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2afe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2aff0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2b000 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2b010 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
2b020 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
2b030 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
2b040 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2b050 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
2b060 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
2b070 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
2b080 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
2b090 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
2b0a0 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
2b0b0 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
2b0c0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  */.    pCur->aiI
2b0d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2b0e0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2b0f0 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
2b100 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
2b110 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2b120 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
2b130 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2b140 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2b150 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  age, idx);.     
2b160 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2b170 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
2b180 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
2b190 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
2b1a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2b1b0 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
2b1c0 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75  >aDataEnd ) retu
2b1d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2b1e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2b1f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2b200 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
2b210 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
2b220 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2b230 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
2b240 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2b250 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2b260 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2b270 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20  >upr ){ c = -1; 
2b280 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2b290 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
2b2a0 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key>intKey ){.  
2b2b0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2b2c0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x-1;.          i
2b2d0 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2b2e0 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = +1; break; }. 
2b2f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b310 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
2b320 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   );.          pC
2b330 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2b340 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
2b350 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2b360 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
2b370 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2b380 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b390 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2b3a0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2b3b0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2b3c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
2b3d0 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
2b3e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2b3f0 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
2b400 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b410 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2b420 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b430 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2b440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2b450 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2b460 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b480 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2b490 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2b4a0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2b4b0 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2b4c0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2b4d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2b4e0 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2b4f0 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b        int nCell;
2b500 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
2b510 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62   pCell cell in b
2b520 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
2b530 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2b540 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2b550 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  dx);..        /*
2b560 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
2b570 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
2b580 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
2b590 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2b5a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2b5b0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
2b5c0 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
2b5d0 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
2b5e0 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
2b5f0 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73   ** page is less
2b600 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65   than 16384 byte
2b610 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f  s and may be sto
2b620 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
2b630 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
2b640 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
2b650 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2b660 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
2b670 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
2b680 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
2b690 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
2b6a0 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
2b6b0 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
2b6c0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
2b6d0 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
2b6e0 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
2b6f0 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
2b700 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
2b710 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
2b720 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
2b730 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2b740 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
2b750 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ];.        if( n
2b760 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
2b770 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a  1bytePayload ){.
2b780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
2b790 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
2b7a0 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
2b7b0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
2b7c0 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
2b7d0 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
2b7e0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
2b7f0 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
2b800 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2b810 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
2b820 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2b830 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b840 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  e( pCell+nCell+1
2b850 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2b860 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2b870 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2b880 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2b890 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
2b8a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2b8b0 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
2b8c0 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
2b8d0 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
2b8e0 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
2b8f0 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
2b900 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
2b910 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b920 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2b930 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
2b940 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
2b950 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2b960 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
2b970 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
2b980 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
2b990 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2b9a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2b9b0 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
2b9c0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2b9d0 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2b9e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2b9f0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2ba00 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
2ba10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ba20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2ba30 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
2ba40 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
2ba50 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
2ba60 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
2ba70 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
2ba80 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
2ba90 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
2baa0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
2bab0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
2bac0 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
2bad0 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
2bae0 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
2baf0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
2bb00 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
2bb10 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
2bb20 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
2bb30 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20  lled. .         
2bb40 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
2bb50 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
2bb60 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78  s corrupt, the x
2bb70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f  RecordCompare ro
2bb80 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20  utine may read. 
2bb90 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74           ** up t
2bba0 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61  o two varints pa
2bbb0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2bbc0 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74  e buffer. An ext
2bbd0 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20  ra 18 .         
2bbe0 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64   ** bytes of pad
2bbf0 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65  ding is allocate
2bc00 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
2bc10 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20  the buffer in.  
2bc20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
2bc30 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a  this happens.  *
2bc40 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
2bc50 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
2bc60 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
2bc70 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
2bc80 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
2bc90 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
2bca0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
2bcb0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
2bcc0 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
2bcd0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2bce0 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
2bcf0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
2bd00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bd10 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f  ( nCell<0 );   /
2bd20 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69  * True if key si
2bd30 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f  ze is 2^32 or mo
2bd40 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
2bd50 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2bd60 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =0 );  /* Invali
2bd70 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2bd80 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20  0 0x80 0x00 */. 
2bd90 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2bda0 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20  e( nCell==1 );  
2bdb0 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2bdc0 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2bdd0 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x01 */.        
2bde0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2bdf0 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  l==2 );  /* Mini
2be00 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20  mum legal index 
2be10 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  key size */.    
2be20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2be30 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2be40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2be50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2be60 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2be70 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2be80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2be90 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2bea0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2beb0 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2bec0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2bed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2bef0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2bf00 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2bf10 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2bf20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2bf30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2bf40 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2bf50 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2bf60 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2bf70 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2bf80 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2bf90 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20  pCellKey, 2);.  
2bfa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2bfb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2bfc0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2bfd0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2bfe0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2bff0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2c000 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
2c010 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2c020 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2c030 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2c040 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c050 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2c060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2c070 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2c080 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2c090 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2c0a0 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2c0b0 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2c0c0 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2c0d0 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2c0e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2c0f0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2c100 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2c110 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2c120 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2c130 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2c140 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2c150 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2c160 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2c170 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c180 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2c190 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2c1a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c1c0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c1d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2c1e0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2c1f0 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2c200 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2c210 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2c220 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2c230 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2c240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2c250 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2c260 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2c270 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2c280 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2c290 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2c2a0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2c2b0 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2c2c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2c2d0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2c2e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2c2f0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2c300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2c310 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2c320 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2c330 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2c340 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2c350 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
2c360 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c370 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
2c380 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
2c390 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2c3a0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2c3b0 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2c3c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c3d0 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2c3e0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2c3f0 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2c400 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2c410 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2c420 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2c430 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2c440 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2c450 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2c460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c470 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2c480 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2c490 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2c4a0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2c4b0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2c4c0 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2c4d0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2c4e0 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2c4f0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2c500 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2c510 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2c520 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2c530 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2c540 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2c550 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2c560 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c570 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2c580 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2c590 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2c5a0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2c5b0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2c5c0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2c5d0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2c5e0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2c5f0 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2c600 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2c610 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2c620 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2c630 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2c640 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2c650 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2c660 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2c670 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2c680 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2c690 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2c6a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2c6b0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2c6c0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2c6d0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2c6e0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2c6f0 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2c700 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2c710 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2c720 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2c730 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2c740 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2c750 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2c760 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2c770 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2c780 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2c790 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2c7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2c7b0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2c7c0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2c7d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2c7e0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2c7f0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2c800 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2c810 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2c820 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2c830 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2c840 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2c850 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2c860 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2c870 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2c880 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2c890 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2c8a0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2c8b0 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2c8c0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2c8d0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2c8e0 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
2c8f0 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2c900 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2c910 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2c920 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
2c930 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2c940 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2c950 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
2c960 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
2c970 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2c980 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2c990 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2c9a0 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
2c9b0 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
2c9c0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2c9d0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2c9e0 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2c9f0 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2ca00 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2ca10 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2ca20 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2ca30 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2ca40 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2ca50 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2ca60 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2ca70 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2ca80 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2ca90 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2caa0 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2cab0 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2cac0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2cad0 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2cae0 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2caf0 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2cb00 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2cb10 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2cb20 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2cb30 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2cb40 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2cb50 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2cb60 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2cb70 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2cb80 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2cb90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2cba0 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2cbb0 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2cbc0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2cbd0 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2cbe0 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2cbf0 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2cc00 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2cc10 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
2cc20 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2cc30 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2cc40 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
2cc50 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2cc60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2cc70 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2cc80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cc90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2cca0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2ccb0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2ccc0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2ccd0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2cce0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2ccf0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
2cd00 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2cd10 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2cd20 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2cd30 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2cd40 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2cd50 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2cd60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cd70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2cd80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2cd90 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2cda0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2cdb0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2cdc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cdd0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2cde0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2cdf0 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
2ce00 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ce10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2ce20 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2ce30 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2ce40 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
2ce50 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2ce60 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2ce70 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
2ce80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2ce90 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2cea0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2ceb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2cec0 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
2ced0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2cee0 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
2cef0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2cf00 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
2cf10 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
2cf20 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2cf30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cf40 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
2cf50 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2cf60 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
2cf70 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2cf80 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
2cf90 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
2cfa0 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
2cfb0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
2cfc0 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
2cfd0 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
2cfe0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
2cff0 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
2d000 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
2d010 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
2d020 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
2d030 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2d040 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
2d050 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
2d060 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
2d070 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
2d080 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
2d090 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
2d0a0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
2d0b0 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
2d0c0 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70  );..  if( idx>=p
2d0d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2d0e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2d0f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2d100 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2d110 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
2d120 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2d130 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
2d140 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2d150 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d160 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2d170 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2d180 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
2d190 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2d1a0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
2d1b0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2d1c0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2d1d0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2d1e0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
2d1f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2d200 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2d210 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2d220 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
2d230 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d240 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
2d250 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
2d260 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
2d270 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2d280 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2d290 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
2d2a0 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  urn sqlite3Btree
2d2b0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2d2c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d2d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d2e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2d2f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2d300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2d320 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2d330 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2d340 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
2d350 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
2d360 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2d370 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d  nt *pRes){.  Mem
2d380 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
2d390 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2d3a0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2d3b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2d3c0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2d3d0 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2d3e0 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2d3f0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2d400 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2d410 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d420 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  LID );.  pCur->i
2d430 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2d440 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2d450 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2d460 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2d470 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  fl);.  *pRes = 0
2d480 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2d490 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d4a0 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2d4b0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2d4c0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2d4d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d4e0 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b  iPage];.  if( (+
2d4f0 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
2d500 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67  r->iPage])>=pPag
2d510 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2d520 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d530 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2d540 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2d550 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2d560 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2d570 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2d580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2d590 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2d5a0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2d5b0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
2d5c0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
2d5d0 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
2d5e0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2d5f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2d600 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
2d610 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
2d620 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
2d630 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
2d640 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2d650 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
2d660 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2d670 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2d680 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2d690 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2d6a0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2d6b0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2d6c0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2d6d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
2d6e0 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2d6f0 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2d700 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2d710 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
2d720 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2d730 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2d740 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2d750 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
2d760 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2d770 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2d780 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
2d790 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
2d7a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2d7b0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2d7c0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2d7d0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2d7e0 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
2d7f0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2d800 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2d810 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
2d820 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
2d830 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
2d840 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
2d850 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
2d860 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
2d870 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
2d880 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2d890 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
2d8a0 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2d8b0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
2d8c0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
2d8d0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
2d8e0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
2d8f0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
2d900 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
2d910 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
2d920 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
2d930 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
2d940 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2d950 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
2d960 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
2d970 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
2d980 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
2d990 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
2d9a0 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
2d9b0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
2d9c0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2d9d0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
2d9e0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
2d9f0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
2da00 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
2da10 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
2da20 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
2da30 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2da40 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
2da50 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2da60 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2da70 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2da80 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2da90 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2daa0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2dab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2dac0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2dad0 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61   *pRes==0 );.  a
2dae0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2daf0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2db00 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2db10 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2db20 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2db30 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2db40 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2db50 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2db60 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2db70 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2db80 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2db90 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2dba0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2dbb0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2dbc0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2dbd0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2dbe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dbf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2dc00 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2dc10 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2dc20 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2dc30 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2dc40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2dc50 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2dc60 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2dc70 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2dc80 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2dc90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2dca0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2dcb0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2dcc0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2dcd0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2dce0 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2dcf0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
2dd00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2dd10 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2dd20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dd30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2dd40 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2dd50 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2dd60 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2dd70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2dd80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2dd90 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2dda0 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2ddb0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ddc0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2ddd0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2dde0 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
2ddf0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2de00 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2de10 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2de20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2de30 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2de40 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2de50 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2de60 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2de70 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2de80 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
2de90 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2dea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2deb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2dec0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2ded0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2dee0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2def0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2df00 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2df10 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2df20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2df30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2df40 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2df50 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2df60 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e  s & (BTCF_ValidN
2df70 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2df80 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2df90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2dfa0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2dfb0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2dfc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2dfd0 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
2dfe0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2dff0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2e010 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2e020 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2e030 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2e040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2e050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e060 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2e070 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2e080 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2e090 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74  *pRes){.  assert
2e0a0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2e0b0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2e0c0 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2e0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2e0e0 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
2e0f0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2e100 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2e110 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2e120 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2e130 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
2e140 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2e150 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
2e160 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2e170 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b  BTCF_ValidNKey);
2e180 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2e190 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
2e1a0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2e1b0 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20  SOR_VALID.   || 
2e1c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2e1d0 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c  ->iPage]==0.   |
2e1e0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2e1f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
2e200 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  f==0.  ){.    re
2e210 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f  turn btreePrevio
2e220 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
2e230 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
2e240 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2e250 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e260 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
2e270 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2e280 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
2e290 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2e2a0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
2e2b0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2e2c0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
2e2d0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
2e2e0 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
2e2f0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
2e300 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
2e310 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
2e320 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
2e330 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
2e340 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
2e350 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
2e360 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
2e370 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
2e380 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
2e390 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
2e3a0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
2e3b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2e3c0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
2e3d0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
2e3e0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
2e3f0 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
2e400 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74    *ppPage is set
2e410 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
2e420 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
2e430 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
2e440 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
2e450 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
2e460 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
2e470 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
2e480 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
2e490 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
2e4a0 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
2e4b0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
2e4c0 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
2e4d0 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
2e4e0 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
2e4f0 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
2e500 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
2e510 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
2e520 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
2e530 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
2e540 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
2e550 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
2e560 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
2e570 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
2e580 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
2e590 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2e5a0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
2e5b0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2e5c0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
2e5d0 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
2e5e0 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
2e5f0 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
2e600 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
2e610 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
2e620 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
2e630 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
2e640 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
2e650 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
2e660 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
2e670 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
2e680 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
2e690 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2e6a0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
2e6b0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
2e6c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
2e6d0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
2e6e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
2e6f0 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
2e700 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
2e710 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2e720 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2e730 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
2e740 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
2e750 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
2e760 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
2e770 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
2e780 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
2e790 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
2e7a0 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
2e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
2e7c0 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
2e7d0 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
2e7e0 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
2e7f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
2e800 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
2e810 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
2e820 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2e830 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2e840 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
2e850 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
2e860 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
2e870 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2e880 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2e890 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2e8a0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
2e8b0 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
2e8c0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
2e8d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2e8e0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
2e8f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e900 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2e910 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2e920 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2e930 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30  ANY || (nearby>0
2e940 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   && IfNotOmitAV(
2e950 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
2e960 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
2e970 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
2e980 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
2e990 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f  ecount(pBt);.  /
2e9a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2e9b0 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65  -05119-02637 The
2e9c0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2e9d0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
2e9e0 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f  fset 36.  ** sto
2e9f0 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74  res stores the t
2ea00 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2ea10 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2ea20 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67  list. */.  n = g
2ea30 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2ea40 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
2ea50 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
2ea60 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
2ea70 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
2ea80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2ea90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
2eaa0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
2eab0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
2eac0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2ead0 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
2eae0 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
2eaf0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
2eb00 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
2eb10 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
2eb20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
2eb30 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
2eb40 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
2eb50 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d     u32 nSearch =
2eb60 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f   0;   /* Count o
2eb70 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2eb80 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20  search attempts 
2eb90 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
2eba0 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
2ebb0 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
2ebc0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
2ebd0 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
2ebe0 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
2ebf0 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
2ec00 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
2ec10 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
2ec20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
2ec30 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
2ec40 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
2ec50 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
2ec60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ec70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2ec80 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2ec90 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
2eca0 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
2ecb0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
2ecc0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
2ecd0 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
2ece0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2ecf0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2ed00 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
2ed10 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2ed20 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
2ed30 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
2ed40 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ed50 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
2ed60 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2ed70 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2ed80 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2ed90 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2eda0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2edb0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2edc0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
2edd0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2ede0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2edf0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
2ee00 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
2ee10 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
2ee20 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
2ee30 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
2ee40 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
2ee50 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
2ee60 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
2ee70 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
2ee80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ee90 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2eea0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2eeb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2eec0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2eed0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2eee0 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
2eef0 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
2ef00 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
2ef10 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
2ef20 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
2ef30 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
2ef40 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
2ef50 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
2ef60 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
2ef70 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
2ef80 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
2ef90 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
2efa0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2efb0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2efc0 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
2efd0 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
2efe0 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
2eff0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2f000 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2f010 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
2f020 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
2f030 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
2f040 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
2f050 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
2f060 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2f070 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
2f080 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
2f090 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
2f0a0 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
2f0b0 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
2f0c0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
2f0d0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f0e0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
2f0f0 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
2f100 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
2f110 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
2f120 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
2f130 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2f140 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
2f150 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
2f160 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f170 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2f180 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
2f190 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
2f1a0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2f1b0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
2f1c0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2f1d0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
2f1e0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
2f1f0 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
2f200 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
2f210 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
2f220 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
2f230 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
2f240 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2f250 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2f260 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2f270 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
2f280 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2f290 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
2f2a0 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68  xPage || nSearch
2f2b0 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20  ++ > n ){.      
2f2c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2f2d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f2f0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
2f300 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54  usedPage(pBt, iT
2f310 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2f320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f330 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f340 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2f350 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2f360 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2f370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2f380 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
2f390 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2f3a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
2f3b0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   );.      /* EVI
2f3c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32  DENCE-OF: R-1352
2f3d0 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f  3-04394 The seco
2f3e0 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  nd integer on a 
2f3f0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2f400 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2f410 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
2f420 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  af page pointers
2f430 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20   to follow. */. 
2f440 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
2f450 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2f460 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
2f470 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
2f480 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
2f490 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
2f4a0 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
2f4b0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
2f4c0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
2f4d0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
2f4e0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
2f4f0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
2f500 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
2f510 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
2f520 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
2f530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f540 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
2f550 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2f560 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f570 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2f580 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f590 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2f5a0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2f5b0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2f5c0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2f5d0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2f5e0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2f5f0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2f600 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2f610 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
2f620 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2f630 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2f640 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2f650 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2f660 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2f670 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2f680 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
2f690 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
2f6a0 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
2f6b0 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
2f6c0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2f6d0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
2f6e0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
2f6f0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
2f700 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f710 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2f720 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f730 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f750 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2f760 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2f770 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
2f780 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
2f790 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
2f7a0 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
2f7b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2f7c0 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
2f7d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
2f7e0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
2f7f0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
2f800 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
2f810 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
2f820 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
2f830 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2f840 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
2f850 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f860 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
2f870 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
2f880 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2f890 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2f8a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2f8b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f8c0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2f8d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2f8e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f8f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f900 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2f920 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
2f930 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2f940 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2f950 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2f960 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2f970 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2f980 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
2f990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2f9a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f9b0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2f9c0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2f9d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f9e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2fa00 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2fa10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2fa20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
2fa30 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
2fa40 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2fa50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2fa60 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
2fa70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fa80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2fa90 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
2faa0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
2fab0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
2fac0 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
2fad0 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
2fae0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
2faf0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
2fb00 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
2fb10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
2fb20 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2fb30 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2fb40 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2fb50 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
2fb60 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
2fb70 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2fb80 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
2fb90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2fba0 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
2fbb0 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
2fbc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2fbd0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2fbe0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2fbf0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2fc00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fc10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fc20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
2fc30 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2fc40 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2fc50 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  edPage(pBt, iNew
2fc60 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
2fc70 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
2fc80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fc90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fca0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fcb0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fcc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fcd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fce0 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
2fcf0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2fd00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2fd10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fd20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2fd30 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
2fd40 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2fd50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2fd60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2fd70 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2fd80 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2fd90 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2fda0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2fdb0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2fdc0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2fdd0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
2fde0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2fdf0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
2fe00 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2fe10 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
2fe20 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
2fe30 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
2fe40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2fe50 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2fe70 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2fe80 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2fe90 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
2feb0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2fec0 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
2fed0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
2fee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2fef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ff00 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2ff10 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2ff20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2ff30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2ff40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2ff50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2ff60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ff70 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2ff80 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2ff90 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
2ffa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ffb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2ffc0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2ffd0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2ffe0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2fff0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
30000 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
30010 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
30020 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
30030 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
30040 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
30050 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
30060 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
30070 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
30080 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
30090 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
300a0 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
300b0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
300c0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
300d0 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
300e0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
300f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
30100 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
30110 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
30120 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30130 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
30140 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
30150 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
30160 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  8+i*4]);.       
30170 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
30180 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  <=nearby ){.    
30190 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
301a0 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
301b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
301d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
301e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
301f0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
30200 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
30210 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41   dist = sqlite3A
30220 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
30230 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
30240 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
30250 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
30260 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
30270 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
30280 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
30290 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
302a0 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
302b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
302c0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
302d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
302e0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
302f0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
30300 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
30310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30320 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
30330 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30340 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
30350 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
30360 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
30370 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
30380 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
30390 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
303a0 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
303b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
303c0 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
303d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
303e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
303f0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
30400 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30410 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
30420 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30430 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
30440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
30450 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
30460 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
30470 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
30480 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
30490 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
304a0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
304b0 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
304c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
304d0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
304e0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
304f0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
30500 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
30510 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
30520 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
30530 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
30540 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
30550 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
30560 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
30570 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
30580 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
30590 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
305a0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
305b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
305c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
305d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
305e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
305f0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
30600 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30610 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
30620 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
30630 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
30640 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
30650 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
30660 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
30670 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
30680 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
30690 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
306a0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
306b0 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
306c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
306d0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
306e0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
306f0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
30700 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30720 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30730 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
30740 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
30750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30780 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
30790 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
307a0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
307b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
307c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
307d0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
307e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
307f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
30800 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
30810 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
30820 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
30830 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
30840 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
30850 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
30860 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
30870 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
30880 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
30890 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
308a0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
308b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
308c0 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
308d0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
308e0 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
308f0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
30900 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
30910 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
30920 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
30930 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
30940 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
30950 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
30960 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
30970 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
30980 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
30990 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
309a0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
309b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
309c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
309d0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
309e0 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
309f0 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
30a00 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
30a10 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
30a20 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
30a30 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
30a40 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
30a50 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
30a60 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
30a70 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
30a80 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
30a90 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
30aa0 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
30ab0 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
30ac0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
30ad0 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
30ae0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
30af0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
30b00 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
30b10 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
30b20 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
30b30 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
30b40 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
30b50 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
30b60 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
30b70 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
30b80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30b90 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
30ba0 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
30bb0 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
30bc0 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
30bd0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
30be0 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
30bf0 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
30c00 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
30c10 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
30c20 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
30c30 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
30c40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
30c50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
30c60 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
30c70 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
30c80 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
30c90 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
30ca0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
30cb0 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
30cc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30cd0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
30ce0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
30cf0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30d00 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
30d10 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
30d20 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
30d30 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
30d40 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
30d50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30d60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30d70 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
30d80 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
30d90 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
30da0 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
30db0 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
30dc0 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
30dd0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
30de0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
30df0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
30e00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
30e10 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
30e20 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
30e30 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
30e40 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
30e50 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
30e60 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
30e70 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
30e80 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
30e90 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
30ea0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
30eb0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
30ec0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
30ed0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
30ee0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
30ef0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
30f00 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
30f10 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
30f20 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
30f30 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30f40 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
30f50 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
30f60 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
30f70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30fa0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
30fb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
30fc0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
30fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30fe0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30ff0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
31000 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
31010 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
31020 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31030 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
31040 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
31050 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
31060 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
31070 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
31080 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
31090 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
310a0 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
310b0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
310c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
310d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
310e0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
310f0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
31100 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
31110 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
31120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
31130 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31140 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
31150 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
31160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31170 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
31180 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
31190 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
311a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
311b0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
311c0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
311d0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
311e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
311f0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
31200 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
31210 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
31220 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
31230 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
31240 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
31250 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
31260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
31270 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
31280 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
31290 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
312a0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
312b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
312c0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
312d0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
312e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
312f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
31300 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
31310 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
31320 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
31330 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
31340 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
31350 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
31360 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
31370 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
31380 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
31390 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
313a0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
313b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
313c0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
313d0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
313e0 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
313f0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
31400 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
31410 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
31420 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
31430 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
31440 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
31450 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
31460 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
31470 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
31480 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
31490 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
314a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
314b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
314c0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
314d0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
314e0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
314f0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
31500 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
31510 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
31520 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
31530 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
31540 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
31550 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31560 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
31570 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
31580 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
31590 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
315a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
315b0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
315c0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
315d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
315e0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
315f0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
31600 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
31610 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
31620 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31640 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
31650 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
31660 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
31670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31680 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
31690 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
316a0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316c0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
316d0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
316e0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
316f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
31700 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
31710 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
31720 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
31730 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
31740 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
31750 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
31760 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
31770 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75  ( iPage<2 ) retu
31780 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
31790 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d  T_BKPT;.  if( pM
317a0 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
317b0 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
317c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
317d0 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
317e0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
317f0 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
31800 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
31810 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
31820 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
31830 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
31840 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
31850 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31860 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
31870 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
31880 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
31890 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
318a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
318b0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
318c0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
318d0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
318e0 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
318f0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
31900 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
31910 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
31920 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
31930 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
31940 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
31950 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
31960 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
31970 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
31980 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
31990 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
319a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
319b0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
319c0 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
319d0 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
319e0 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
319f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
31a00 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
31a10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
31a20 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31a30 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
31a40 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
31a50 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
31a60 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
31a70 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
31a80 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
31a90 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
31aa0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
31ab0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
31ac0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
31ad0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
31ae0 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
31af0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31b00 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
31b10 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
31b20 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
31b30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31b40 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31b50 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
31b60 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
31b70 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
31b80 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
31b90 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
31ba0 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
31bb0 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
31bc0 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
31bd0 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
31be0 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
31bf0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
31c00 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
31c10 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
31c20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
31c30 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
31c40 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
31c50 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
31c60 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
31c70 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
31c80 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
31c90 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
31ca0 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
31cb0 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
31cc0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
31cd0 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
31ce0 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
31cf0 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
31d00 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
31d10 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d30 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
31d40 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
31d50 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
31d60 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
31d70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
31d80 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
31d90 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
31da0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
31db0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
31dc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
31de0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
31df0 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
31e00 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
31e10 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
31e20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
31e30 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
31e40 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
31e50 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
31e60 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
31e70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31e80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31e90 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
31ea0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
31eb0 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
31ec0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
31ed0 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
31ee0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
31ef0 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
31f00 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
31f10 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
31f20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
31f30 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
31f40 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
31f50 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
31f60 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
31f70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
31f80 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
31f90 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
31fa0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
31fb0 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
31fc0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
31fd0 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
31fe0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
31ff0 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
32000 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
32010 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
32020 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
32030 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
32040 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
32050 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
32060 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
32070 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
32080 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
32090 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
320a0 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
320b0 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
320c0 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
320d0 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
320e0 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
320f0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
32100 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
32110 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
32120 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
32130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
32140 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
32150 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
32160 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
32170 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
32180 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
32190 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
321a0 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
321b0 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
321c0 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
321d0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
321e0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
321f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
32200 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
32210 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
32220 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
32230 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
32240 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
32250 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65  19920-11576 Howe
32260 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69  ver, newer versi
32270 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74  ons of SQLite st
32280 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f  ill.      ** avo
32290 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73  id using the las
322a0 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e  t six entries in
322b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72   the freelist tr
322c0 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69  unk page array i
322d0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
322e0 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
322f0 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20  iles created by 
32300 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
32310 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a  f SQLite can be.
32320 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79        ** read by
32330 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
32340 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20  of SQLite..     
32350 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
32360 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32370 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
32380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
32390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
323a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
323b0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
323c0 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
323d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
323e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
323f0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
32400 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
32410 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  e && (pBt->btsFl
32420 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
32430 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
32440 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32450 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
32460 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
32470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32480 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
32490 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
324a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
324b0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
324c0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
324d0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
324e0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
324f0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
32500 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
32510 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
32520 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
32530 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
32540 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
32550 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
32560 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
32570 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
32580 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
32590 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
325a0 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
325b0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
325c0 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
325d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
325e0 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
325f0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
32600 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
32610 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
32620 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
32630 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
32640 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
32650 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
32660 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
32670 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
32680 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
32690 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
326a0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
326b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
326c0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
326d0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
326e0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
326f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
32700 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
32710 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
32720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32730 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
32740 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
32750 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
32760 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
32770 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
32780 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
32790 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
327a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
327b0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
327c0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
327d0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
327e0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
327f0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
32800 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
32810 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
32820 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
32830 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
32840 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
32850 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
32860 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
32870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
32880 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
32890 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
328a0 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
328b0 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
328c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
328d0 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
328e0 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
328f0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
32900 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
32910 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
32920 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
32930 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
32940 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a  ell.  Write the.
32950 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69  ** local Cell si
32960 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f  ze (the number o
32970 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f  f bytes on the o
32980 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d  riginal page, om
32990 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c  itting.** overfl
329a0 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65  ow) into *pnSize
329b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
329c0 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
329d0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
329e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
329f0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
32a00 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
32a10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
32a20 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
32a30 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
32a40 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a   */.  u16 *pnSiz
32a50 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e              /
32a60 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a 65  * Write the size
32a70 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72   of the Cell her
32a80 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  e */.){.  BtShar
32a90 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
32aa0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
32ab0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
32ac0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
32ad0 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
32ae0 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
32af0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
32b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
32b10 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
32b20 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
32b30 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
32b40 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
32b50 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
32b60 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69  o.nSize;.  if( i
32b70 6e 66 6f 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66 6f  nfo.nLocal==info
32b80 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
32b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32ba0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
32bb0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
32bc0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
32bd0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
32be0 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
32bf0 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d  nSize-1 > pPage-
32c00 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
32c10 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
32c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
32c30 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65  UPT_BKPT;  /* Ce
32c40 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
32c50 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
32c60 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
32c70 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b  get4byte(pCell +
32c80 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 2d 20 34 29   info.nSize - 4)
32c90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
32ca0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
32cb0 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
32cc0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
32cd0 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
32ce0 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
32cf0 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
32d00 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
32d10 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
32d20 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66  ;.  assert( nOvf
32d30 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52  l>0 || .    (COR
32d40 52 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66 6f  RUPT_DB && (info
32d50 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c  .nPayload + ovfl
32d60 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61  PageSize)<ovflPa
32d70 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77  geSize).  );.  w
32d80 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
32d90 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
32da0 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
32db0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
32dc0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
32dd0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
32de0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
32df0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
32e00 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
32e10 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
32e20 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
32e30 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
32e40 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
32e50 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
32e60 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
32e70 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
32e80 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
32e90 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
32ea0 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
32eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
32ec0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
32ed0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
32ee0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
32ef0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
32f00 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
32f10 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
32f20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
32f30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
32f40 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
32f50 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
32f60 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
32f70 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
32f80 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
32f90 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
32fa0 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
32fb0 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
32fc0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
32fd0 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
32fe0 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
32ff0 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
33000 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
33010 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
33020 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
33030 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
33040 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
33050 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
33060 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
33070 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
33080 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
33090 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
330a0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
330b0 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
330c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
330d0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
330e0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
330f0 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
33100 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
33110 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
33120 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
33130 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
33140 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
33150 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
33160 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
33170 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
33180 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
33190 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
331a0 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
331b0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
331c0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
331d0 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
331e0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
331f0 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
33200 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
33210 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
33220 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
33230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
33240 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33250 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
33260 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
33270 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
33280 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
33290 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
332a0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
332b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
332c0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
332d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
332e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
332f0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
33300 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
33310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
33320 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
33330 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
33340 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
33350 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
33360 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
33370 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
33380 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
33390 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
333a0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
333b0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
333c0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
333d0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
333e0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
333f0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
33400 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
33410 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
33420 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
33430 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
33440 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
33450 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
33460 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
33470 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
33480 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
33490 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
334a0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
334b0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
334c0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
334d0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
334e0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
334f0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
33500 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
33510 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
33520 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
33530 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
33540 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
33550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33560 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
33570 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
33580 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33590 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
335a0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
335b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
335c0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
335d0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
335e0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
335f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
33600 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
33610 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
33620 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
33630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33640 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
33650 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
33660 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
33670 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
33680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
33690 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
336a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
336b0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
336c0 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
336d0 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
336e0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
336f0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
33700 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
33710 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
33720 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33730 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
33740 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
33750 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
33760 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
33770 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
33780 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
33790 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  ader;..  assert(
337a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
337b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
337c0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
337d0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
337e0 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
337f0 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
33800 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
33810 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
33820 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
33830 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
33840 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
33850 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
33860 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
33870 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
33880 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
33890 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
338a0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
338b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
338c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
338d0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
338e0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
338f0 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d  nHeader = pPage-
33900 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
33910 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
33920 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
33930 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
33940 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
33950 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
33960 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
33970 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d  , nPayload);.  }
33980 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33990 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  ( nData==0 );.  
339a0 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d    assert( nZero=
339b0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61  =0 );.  }.  nHea
339c0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
339d0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
339e0 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
339f0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
33a00 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a   the payload siz
33a10 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  e */.  if( pPage
33a20 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
33a30 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
33a40 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
33a50 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
33a60 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73   }else{ .    ass
33a70 65 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66  ert( nKey<=0x7ff
33a80 66 66 66 66 66 20 26 26 20 70 4b 65 79 21 3d 30  fffff && pKey!=0
33a90 20 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   );.    nPayload
33aa0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
33ab0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
33ac0 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
33ad0 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Key;.  }.  if( n
33ae0 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
33af0 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
33b00 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
33b10 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
33b20 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
33b30 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
33b40 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
33b50 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
33b60 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
33b70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
33b80 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
33b90 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
33ba0 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
33bb0 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
33bc0 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
33bd0 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
33be0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
33bf0 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
33c00 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
33c10 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
33c20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
33c30 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
33c40 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
33c50 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
33c60 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
33c70 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
33c80 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
33c90 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
33ca0 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
33cb0 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
33cc0 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
33cd0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
33ce0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
33cf0 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
33d00 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
33d10 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
33d20 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
33d30 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
33d40 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
33d50 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
33d60 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
33d70 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
33d80 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
33d90 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
33da0 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
33db0 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
33dc0 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
33dd0 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
33de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33df0 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
33e00 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
33e10 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
33e20 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
33e30 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
33e40 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
33e50 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
33e60 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
33e70 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
33e80 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
33e90 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
33ea0 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
33eb0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
33ec0 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
33ed0 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
33ee0 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
33ef0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
33f00 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
33f10 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
33f20 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
33f30 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
33f40 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
33f50 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65   info;.    pPage
33f60 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
33f70 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
33f80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
33f90 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e  Header==(int)(in
33fa0 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
33fb0 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
33fc0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
33fd0 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
33fe0 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
33ff0 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
34000 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
34010 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
34020 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
34030 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
34040 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
34050 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
34060 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
34070 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
34080 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
34090 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
340a0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
340b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
340c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
340d0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
340e0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
340f0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
34100 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
34110 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
34120 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34130 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
34140 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
34150 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
34160 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
34170 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
34180 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
34190 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
341a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
341b0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
341c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
341d0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
341e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
341f0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
34200 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
34210 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
34220 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34230 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
34240 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34250 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34260 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
34270 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
34280 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
34290 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
342a0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
342b0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
342c0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
342d0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
342e0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
342f0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
34300 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
34310 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
34320 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
34330 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
34340 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
34350 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
34360 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
34370 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
34380 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
34390 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
343a0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
343b0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
343c0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
343d0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
343e0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
343f0 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
34400 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
34410 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
34420 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
34430 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
34440 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
34450 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
34460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34470 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
34480 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
34490 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
344a0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
344b0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
344c0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
344d0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
344e0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
344f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
34500 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34510 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
34520 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
34530 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
34540 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
34550 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
34560 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
34570 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
34580 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
34590 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
345a0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
345b0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
345c0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
345d0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
345e0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
345f0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
34600 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
34610 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
34620 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
34630 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34640 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
34650 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34660 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
34670 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
34680 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
34690 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
346a0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
346b0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
346c0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
346d0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
346e0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
346f0 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
34700 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34710 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34720 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34730 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34740 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
34750 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34760 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
34770 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34780 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
34790 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
347a0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
347b0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
347c0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
347d0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
347e0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
347f0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
34800 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
34810 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
34820 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
34830 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
34840 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
34850 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
34860 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
34870 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
34880 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
34890 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
348a0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
348b0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
348c0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
348d0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
348e0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
348f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
34900 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
34910 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34920 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
34930 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
34940 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
34950 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
34960 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
34970 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
34980 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
34990 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
349a0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
349b0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
349c0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
349d0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
349e0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
349f0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
34a00 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34a10 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
34a20 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
34a30 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
34a40 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
34a50 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
34a60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
34a70 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
34a80 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
34a90 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
34aa0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
34ab0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
34ac0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
34ad0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
34ae0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
34af0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
34b00 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
34b10 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
34b20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
34b30 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
34b40 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
34b50 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
34b60 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
34b70 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
34b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
34ba0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
34bb0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
34bc0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
34bd0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
34be0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
34bf0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
34c00 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
34c10 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
34c20 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
34c30 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
34c40 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
34c50 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
34c60 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
34c70 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
34c80 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
34c90 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
34ca0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
34cb0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
34cc0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
34cd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
34ce0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
34cf0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
34d00 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
34d10 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
34d20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
34d30 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
34d40 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
34d50 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
34d60 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
34d70 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
34d80 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
34d90 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
34da0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
34db0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
34dc0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
34dd0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
34de0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
34df0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
34e00 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
34e10 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
34e20 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
34e30 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
34e40 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
34e50 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
34e60 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
34e70 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
34e80 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
34e90 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
34ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
34eb0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34ec0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
34ed0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
34ee0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34ef0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
34f00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
34f10 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
34f20 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
34f30 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
34f40 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
34f50 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
34f60 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
34f70 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
34f80 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
34f90 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
34fa0 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
34fb0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
34fc0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
34fd0 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
34fe0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
34ff0 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
35000 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
35010 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
35020 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35030 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
35040 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
35050 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
35060 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
35070 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
35080 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
35090 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
350a0 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  --;.  if( pPage-
350b0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
350c0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
350d0 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20  r+1], 0, 4);.   
350e0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
350f0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
35100 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61  data[hdr+5], pPa
35110 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35120 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize);.    pPage-
35130 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
35140 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35150 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  - pPage->hdrOffs
35160 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
35170 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67            - pPag
35180 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
35190 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 8;.  }else{.  
351a0 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
351b0 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
351c0 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
351d0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
351e0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
351f0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
35200 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
35210 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
35220 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
35230 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
35240 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
35250 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
35260 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
35270 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
35280 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
35290 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
352a0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
352b0 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
352c0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
352d0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
352e0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
352f0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
35300 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
35310 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
35320 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
35330 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
35340 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
35350 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
35360 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
35370 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
35380 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
35390 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
353a0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
353b0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
353c0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
353d0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
353e0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
353f0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
35400 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
35410 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
35420 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mented..*/.stati
35430 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
35440 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
35450 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
35460 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
35470 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
35480 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
35490 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
354a0 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
354b0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
354c0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
354d0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
354e0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
354f0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
35500 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
35510 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
35520 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
35530 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
35540 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
35550 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
35560 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
35570 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
35580 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
35590 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
355a0 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
355b0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
355c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
355d0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
355e0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
355f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
35600 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
35610 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
35620 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
35630 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
35640 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
35650 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
35660 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
35670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
35680 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
35690 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
356a0 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
356b0 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
356c0 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
356d0 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
356e0 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66  nserted */..  if
356f0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
35700 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
35710 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
35720 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
35730 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
35740 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  ( MX_CELL(pPage-
35750 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
35760 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35770 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
35780 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43  pPage->pBt) || C
35790 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
357a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
357b0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
357c0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
357d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
357e0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
357f0 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
35800 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
35810 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
35820 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35830 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
35840 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
35850 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
35860 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
35870 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
35880 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
35890 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
358a0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
358b0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
358c0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
358d0 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
358e0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
358f0 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
35900 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
35910 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
35920 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
35930 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
35940 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
35950 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
35960 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
35970 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
35980 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
35990 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
359a0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
359b0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50    assert( sz==pP
359c0 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
359d0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
359e0 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
359f0 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
35a00 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
35a10 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
35a20 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
35a30 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
35a40 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c  cpy(pTemp, pCell
35a50 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65  , sz);.      pCe
35a60 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
35a70 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
35a80 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
35a90 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
35aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
35ab0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35ac0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
35ad0 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
35ae0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
35af0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
35b00 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
35b10 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
35b20 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
35b30 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
35b40 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a   (u16)i;..    /*
35b50 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f   When multiple o
35b60 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20  verflows occur, 
35b70 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  they are always 
35b80 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69  sequential and i
35b90 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20  n.    ** sorted 
35ba0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76  order.  This inv
35bb0 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65  ariants arise be
35bc0 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f  cause multiple o
35bd0 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20  verflows can.   
35be0 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77   ** only occur w
35bf0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69  hen inserting di
35c00 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
35c10 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
35c20 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62   during.    ** b
35c30 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68  alancing, and th
35c40 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61  e dividers are a
35c50 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74  djacent and sort
35c60 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ed..    */.    a
35c70 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70  ssert( j==0 || p
35c80 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
35c90 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f  ]<(u16)i ); /* O
35ca0 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74  verflows in sort
35cb0 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
35cc0 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
35cd0 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  i==pPage->aiOvfl
35ce0 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20  [j-1]+1 );   /* 
35cf0 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65  Overflows are se
35d00 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65  quential */.  }e
35d10 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
35d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35d30 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
35d40 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
35d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35d60 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
35d70 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
35d80 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
35d90 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35da0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
35db0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
35dc0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
35dd0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  a;.    assert( &
35de0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
35df0 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e  Offset]==pPage->
35e00 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20  aCellIdx );.    
35e10 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
35e20 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
35e30 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
35e40 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
35e50 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
35e60 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
35e70 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
35e80 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
35e90 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20  ing properties. 
35ea0 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
35eb0 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
35ec0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35ed0 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  idx >= 0 );.    
35ee0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70  assert( idx >= p
35ef0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
35f00 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  +2*pPage->nCell+
35f10 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  2 || CORRUPT_DB 
35f20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
35f30 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
35f40 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
35f50 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
35f60 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
35f70 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
35f80 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d  emcpy(&data[idx]
35f90 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
35fa0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
35fb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
35fc0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
35fd0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
35fe0 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c  ns = pPage->aCel
35ff0 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20  lIdx + i*2;.    
36000 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20  memmove(pIns+2, 
36010 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e  pIns, 2*(pPage->
36020 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20  nCell - i));.   
36030 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20   put2byte(pIns, 
36040 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  idx);.    pPage-
36050 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a  >nCell++;.    /*
36060 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63   increment the c
36070 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  ell count */.   
36080 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61   if( (++data[pPa
36090 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d  ge->hdrOffset+4]
360a0 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67  )==0 ) data[pPag
360b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b  e->hdrOffset+3]+
360c0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  +;.    assert( g
360d0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
360e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
360f0 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])==pPage->nCell
36100 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
36110 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36120 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
36130 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
36140 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
36150 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
36160 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
36170 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
36180 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
36190 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
361a0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
361b0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
361c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
361d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
361e0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
361f0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
36200 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
36210 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65   }.}../*.** A Ce
36220 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63  llArray object c
36230 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65 20  ontains a cache 
36240 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  of pointers and 
36250 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63  sizes for a.** c
36260 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75 65  onsecutive seque
36270 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61  nce of cells tha
36280 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20  t might be held 
36290 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a  multiple pages..
362a0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
362b0 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c  t CellArray Cell
362c0 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65  Array;.struct Ce
362d0 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20  llArray {.  int 
362e0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
362f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36300 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
36310 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
36320 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pRef;          
36330 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67  /* Reference pag
36340 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
36350 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll;            /
36360 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
36370 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
36380 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
36390 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
363a0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
363b0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
363c0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  /.};../*.** Make
363d0 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73   sure the cell s
363e0 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78  izes at idx, idx
363f0 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31  +1, ..., idx+N-1
36400 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f   have been.** co
36410 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
36420 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43  c void populateC
36430 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72  ellCache(CellArr
36440 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ay *p, int idx, 
36450 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
36460 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b  ( idx>=0 && idx+
36470 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  N<=p->nCell );. 
36480 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20   while( N>0 ){. 
36490 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70     assert( p->ap
364a0 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a  Cell[idx]!=0 );.
364b0 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c      if( p->szCel
364c0 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20  l[idx]==0 ){.   
364d0 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
364e0 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
364f0 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
36500 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b  p->apCell[idx]);
36510 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36520 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
36530 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20  T_DB ||.        
36540 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
36550 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78  idx]==p->pRef->x
36560 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
36570 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d  , p->apCell[idx]
36580 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ) );.    }.    i
36590 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20  dx++;.    N--;. 
365a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
365b0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
365c0 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f  he Nth element o
365d0 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79  f the cell array
365e0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
365f0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63  E_NOINLINE u16 c
36600 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43  omputeCellSize(C
36610 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
36620 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
36630 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
36640 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
36650 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29  ->szCell[N]==0 )
36660 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  ;.  p->szCell[N]
36670 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
36680 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
36690 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20  ->apCell[N]);.  
366a0 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
366b0 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  [N];.}.static u1
366c0 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  6 cachedCellSize
366d0 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
366e0 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
366f0 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43   N>=0 && N<p->nC
36700 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ell );.  if( p->
36710 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75  szCell[N] ) retu
36720 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
36730 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74  .  return comput
36740 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b  eCellSize(p, N);
36750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
36760 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
36770 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43  s pointers to nC
36780 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20  ell b-tree page 
36790 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73  cells. The .** s
367a0 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f  zCell[] array co
367b0 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
367c0 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
367d0 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
367e0 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73  tion.** replaces
367f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
36800 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50  tents of page pP
36810 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  g with the conte
36820 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a  nts of the cell.
36830 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ** array..**.** 
36840 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Some of the cell
36850 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61  s in apCell[] ma
36860 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
36870 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68  tored in pPg. Th
36880 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
36890 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62  orks around prob
368a0 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74  lems caused by t
368b0 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20  his by making a 
368c0 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20  copy of any .** 
368d0 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72  such cells befor
368e0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  e overwriting th
368f0 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a  e page data..**.
36900 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e  ** The MemPage.n
36910 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
36920 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
36930 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  s function. It i
36940 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
36950 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
36960 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
36970 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
36980 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c  tatic int rebuil
36990 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
369a0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
369b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
369c0 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
369d0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
369e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369f0 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
36a00 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
36a10 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
36a20 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
36a30 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
36a40 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
36a50 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
36a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36a70 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
36a80 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
36a90 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
36aa0 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
36ab0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
36ac0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
36ad0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
36ae0 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
36af0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
36b00 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
36b10 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
36b20 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
36b30 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
36b40 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
36b50 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
36b60 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
36b70 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
36b80 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
36b90 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
36ba0 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
36bb0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
36bc0 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
36bd0 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
36be0 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
36bf0 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
36c00 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
36c10 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
36c20 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
36c30 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
36c40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
36c50 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
36c60 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
36c70 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  i];.    if( SQLI
36c80 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c  TE_WITHIN(pCell,
36c90 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20  aData,pEnd) ){. 
36ca0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
36cb0 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
36cc0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61  ];.    }.    pDa
36cd0 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  ta -= szCell[i];
36ce0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
36cf0 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d  ellptr, (pData -
36d00 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43   aData));.    pC
36d10 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20  ellptr += 2;.   
36d20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65   if( pData < pCe
36d30 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53  llptr ) return S
36d40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
36d50 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  PT;.    memcpy(p
36d60 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43  Data, pCell, szC
36d70 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73  ell[i]);.    ass
36d80 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d  ert( szCell[i]==
36d90 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
36da0 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f  Pg, pCell) || CO
36db0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
36dc0 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c  testcase( szCell
36dd0 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]!=pPg->xCellS
36de0 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29  ize(pPg,pCell) )
36df0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
36e00 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
36e10 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f   is now set inco
36e20 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c  rrectly. The cal
36e30 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e  ler will fix it.
36e40 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c   */.  pPg->nCell
36e50 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d   = nCell;.  pPg-
36e60 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
36e70 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
36e80 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20  ta[hdr+1], 0);. 
36e90 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
36ea0 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
36eb0 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
36ec0 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20  (&aData[hdr+5], 
36ed0 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a  pData - aData);.
36ee0 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d    aData[hdr+7] =
36ef0 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20   0x00;.  return 
36f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
36f10 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
36f20 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
36f30 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
36f40 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
36f50 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74  y szCell.** cont
36f60 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
36f70 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
36f80 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
36f90 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
36fa0 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20   to .** add the 
36fb0 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20  cells stored in 
36fc0 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67  the array to pag
36fd0 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e  e pPg. If it can
36fe0 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a  not (because .**
36ff0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
37000 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74  to be defragment
37010 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65  ed before the ce
37020 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e  lls will fit), n
37030 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65  on-zero.** is re
37040 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
37050 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20  e, if the cells 
37060 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73  are added succes
37070 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a  sfully, zero is.
37080 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
37090 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c  ** Argument pCel
370a0 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  lptr points to t
370b0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
370c0 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
370d0 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72  er array.** (par
370e0 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74  t of page pPg) t
370f0 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65  o populate. Afte
37100 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d  r cell apCell[0]
37110 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
37120 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c  he.** page body,
37130 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74   a 16-bit offset
37140 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70   is written to p
37150 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20  Cellptr. And so 
37160 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  on, for each.** 
37170 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
37180 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  y. It is the res
37190 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
371a0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
371b0 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ure.** that it i
371c0 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72  s safe to overwr
371d0 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66  ite this part of
371e0 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
371f0 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57  r array..**.** W
37200 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
37210 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70  n is called, *pp
37220 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74  Data points to t
37230 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
37240 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  .** content area
37250 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66   on page pPg. If
37260 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
37270 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73   content area is
37280 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70   extended,.** *p
37290 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65 64  pData is updated
372a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
372b0 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74 68   new start of th
372c0 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a  e content area.*
372d0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
372e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c  ng..**.** Finall
372f0 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67  y, argument pBeg
37300 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  in points to the
37310 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
37320 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a  y following the.
37330 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70  ** end of the sp
37340 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79 20  ace required by 
37350 74 68 69 73 20 70 61 67 65 20 66 6f 72 20 74 68  this page for th
37360 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
37370 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20  rea (for.** all 
37380 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74  cells - not just
37390 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20   those inserted 
373a0 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  by the current c
373b0 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e  all). If the con
373c0 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73  tent.** area mus
373d0 74 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  t be extended to
373e0 20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69   before this poi
373f0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  nt in order to a
37400 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a  ccomodate all.**
37410 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
37420 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c  [], then the cel
37430 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e  ls do not fit an
37440 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  d non-zero is re
37450 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
37460 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74  c int pageInsert
37470 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65  Array(.  MemPage
37480 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
37490 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
374a0 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f   to add cells to
374b0 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e   */.  u8 *pBegin
374c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
374d0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
374e0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
374f0 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44  ay */.  u8 **ppD
37500 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
37510 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
37520 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  T: Page content 
37530 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f  -area pointer */
37540 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c  .  u8 *pCellptr,
37550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37560 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
37570 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
37580 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  ea */.  int iFir
37590 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
375a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
375b0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
375c0 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  o add */.  int n
375d0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
375e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
375f0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
37600 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20   add to pPg */. 
37610 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72   CellArray *pCAr
37620 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
37630 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
37640 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
37650 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  ;.  u8 *aData = 
37660 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38  pPg->aData;.  u8
37670 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74   *pData = *ppDat
37680 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  a;.  int iEnd = 
37690 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a  iFirst + nCell;.
376a0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
376b0 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72  T_DB || pPg->hdr
376c0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
376d0 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
376e0 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66  on page 1 */.  f
376f0 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69  or(i=iFirst; i<i
37700 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  End; i++){.    i
37710 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75  nt sz, rc;.    u
37720 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a  8 *pSlot;.    sz
37730 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a   = cachedCellSiz
37740 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20  e(pCArray, i);. 
37750 20 20 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d     if( (aData[1]
37760 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d  ==0 && aData[2]=
37770 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20  =0) || (pSlot = 
37780 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67  pageFindSlot(pPg
37790 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a  ,sz,&rc))==0 ){.
377a0 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73        pData -= s
377b0 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  z;.      if( pDa
377c0 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75  ta<pBegin ) retu
377d0 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f  rn 1;.      pSlo
377e0 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  t = pData;.    }
377f0 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e  .    /* pSlot an
37800 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  d pCArray->apCel
37810 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20  l[i] will never 
37820 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c  overlap on a wel
37830 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20  l-formed.    ** 
37840 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 74  database.  But t
37850 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20  hey might for a 
37860 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
37870 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d  .  Hence use mem
37880 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69  move().    ** si
37890 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e  nce memcpy() sen
378a0 64 73 20 53 49 47 41 42 4f 52 54 20 77 69 74 68  ds SIGABORT with
378b0 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66   overlapping buf
378c0 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20  fers on OpenBSD 
378d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
378e0 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72  pSlot+sz)<=pCArr
378f0 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20  ay->apCell[i].  
37900 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e         || pSlot>
37910 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  =(pCArray->apCel
37920 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20  l[i]+sz).       
37930 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
37940 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
37950 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61  Slot, pCArray->a
37960 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20  pCell[i], sz);. 
37970 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
37980 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61  lptr, (pSlot - a
37990 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
379a0 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  lptr += 2;.  }. 
379b0 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61   *ppData = pData
379c0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
379d0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
379e0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
379f0 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
37a00 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
37a10 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20  rray szCell .** 
37a20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
37a30 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
37a40 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
37a50 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73  is function adds
37a60 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73   the.** space as
37a70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
37a80 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ch cell in the a
37a90 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72  rray that is cur
37aa0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a  rently stored .*
37ab0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64  * within the bod
37ac0 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20  y of pPg to the 
37ad0 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  pPg free-list. T
37ae0 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73  he cell-pointers
37af0 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69   and other.** fi
37b00 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65  elds of the page
37b10 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64   are not updated
37b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
37b30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
37b40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
37b50 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f  f cells added to
37b60 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
37b70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
37b80 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d  geFreeArray(.  M
37b90 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
37ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37bb0 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a  * Page to edit *
37bc0 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
37bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37be0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c      /* First cel
37bf0 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
37c00 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c   /* Cells to del
37c30 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  ete */.  CellArr
37c40 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
37c50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
37c60 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
37c70 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
37c80 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
37c90 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
37ca0 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
37cb0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37cc0 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
37cd0 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
37ce0 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
37cf0 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64  + 8 + pPg->child
37d00 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  PtrSize];.  int 
37d10 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
37d20 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  i;.  int iEnd = 
37d30 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a  iFirst + nCell;.
37d40 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
37d50 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20  .  int szFree = 
37d60 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72  0;..  for(i=iFir
37d70 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29  st; i<iEnd; i++)
37d80 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
37d90 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  = pCArray->apCel
37da0 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51  l[i];.    if( SQ
37db0 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c  LITE_WITHIN(pCel
37dc0 6c 2c 20 70 53 74 61 72 74 2c 20 70 45 6e 64 29  l, pStart, pEnd)
37dd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
37de0 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ;.      /* No ne
37df0 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64  ed to use cached
37e00 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e  CellSize() here.
37e10 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61    The sizes of a
37e20 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20  ll cells that.  
37e30 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65      ** are to be
37e40 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65   freed have alre
37e50 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69  ady been computi
37e60 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e  ng while decidin
37e70 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  g which.      **
37e80 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65   cells need free
37e90 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20  ing */.      sz 
37ea0 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c  = pCArray->szCel
37eb0 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73  l[i];  assert( s
37ec0 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  z>0 );.      if(
37ed0 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b   pFree!=(pCell +
37ee0 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20   sz) ){.        
37ef0 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
37f00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37f10 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
37f20 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
37f30 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20  536 );.         
37f40 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
37f50 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
37f60 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
37f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37f80 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
37f90 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d          szFree =
37fa0 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28   sz;.        if(
37fb0 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29   pFree+sz>pEnd )
37fc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
37fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37fe0 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
37ff0 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d         szFree +=
38000 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
38010 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d     nRet++;.    }
38020 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65  .  }.  if( pFree
38030 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
38040 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
38050 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
38060 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65  5536 );.    free
38070 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
38080 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
38090 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20   szFree);.  }.  
380a0 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
380b0 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61  /*.** apCell[] a
380c0 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74  nd szCell[] cont
380d0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
380e0 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c   and sizes of al
380f0 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a  l cells in the.*
38100 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  * pages being ba
38110 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72  lanced.  The cur
38120 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20  rent page, pPg, 
38130 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63  has pPg->nCell c
38140 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ells starting.**
38150 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c   with apCell[iOl
38160 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e  d].  After balan
38170 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20  cing, this page 
38180 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77  should hold nNew
38190 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69   cells.** starti
381a0 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65  ng at apCell[iNe
381b0 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  w]..**.** This r
381c0 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
381d0 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
381e0 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f  tments to pPg so
381f0 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
38200 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
38210 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69   cells after bei
38220 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a  ng balanced..**.
38230 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  ** The pPg->nFre
38240 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
38250 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  id when this fun
38260 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
38270 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70  t is the.** resp
38280 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
38290 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
382a0 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
382b0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74  .static int edit
382c0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
382d0 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
382e0 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
382f0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
38300 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20  nt iOld,        
38310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38320 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
38330 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20   cell currently 
38340 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
38350 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   iNew,          
38360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38370 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72  Index of new fir
38380 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20  st cell on page 
38390 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20  */.  int nNew,  
383a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383b0 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
383c0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
383d0 20 70 61 67 65 20 2a 2f 0a 20 20 43 65 6c 6c 41   page */.  CellA
383e0 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20  rray *pCArray   
383f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
38400 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 61 6e 64  ray of cells and
38410 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   sizes */.){.  u
38420 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
38430 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
38440 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
38450 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
38460 20 20 75 38 20 2a 70 42