/ Hex Artifact Content
Login

Artifact 76a514d839f190ac9fc2fcdfcf4e702e656368bf4936f81992edbf1ee83b2fc5:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  , b) 0.#endif../
0f60: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0f70: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
0f80: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 29  E_CORRUPT_PAGE()
0f90: 20 6d 61 63 72 6f 2e 20 54 61 6b 65 73 20 61 20   macro. Takes a 
0fa0: 73 69 6e 67 6c 65 0a 2a 2a 20 28 4d 65 6d 50 61  single.** (MemPa
0fb0: 67 65 2a 29 20 61 73 20 61 6e 20 61 72 67 75 6d  ge*) as an argum
0fc0: 65 6e 74 2e 20 54 68 65 20 28 4d 65 6d 50 61 67  ent. The (MemPag
0fd0: 65 2a 29 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  e*) must not be 
0fe0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  NULL..**.** If S
0ff0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 6e  QLITE_DEBUG is n
1000: 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  ot defined, then
1010: 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 65   this macro is e
1020: 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 2a 2a 20  quivalent to.** 
1030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1040: 4b 50 54 2e 20 4f 72 2c 20 69 66 20 53 51 4c 49  KPT. Or, if SQLI
1050: 54 45 5f 44 45 42 55 47 20 69 73 20 73 65 74 2c  TE_DEBUG is set,
1060: 20 74 68 65 6e 20 74 68 65 20 6c 6f 67 20 6d 65   then the log me
1070: 73 73 61 67 65 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  ssage.** normall
1080: 79 20 70 72 6f 64 75 63 65 64 20 61 73 20 61 20  y produced as a 
1090: 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20 53  side-effect of S
10a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10b0: 50 54 20 69 73 20 61 75 67 6d 65 6e 74 65 64 0a  PT is augmented.
10c0: 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
10d0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 66 69 6c 65   number and file
10e0: 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20  name associated 
10f0: 77 69 74 68 20 74 68 65 20 28 4d 65 6d 50 61 67  with the (MemPag
1100: 65 2a 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  e*)..*/.#ifdef S
1110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
1120: 63 6f 72 72 75 70 74 50 61 67 65 45 72 72 6f 72  corruptPageError
1130: 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 4d 65 6d  (int lineno, Mem
1140: 50 61 67 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  Page *p){.  char
1150: 20 2a 7a 4d 73 67 3b 0a 20 20 73 71 6c 69 74 65   *zMsg;.  sqlite
1160: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1170: 6f 63 28 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73  oc();.  zMsg = s
1180: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1190: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
11a0: 69 6f 6e 20 70 61 67 65 20 25 64 20 6f 66 20 25  ion page %d of %
11b0: 73 22 2c 0a 20 20 20 20 20 20 28 69 6e 74 29 70  s",.      (int)p
11c0: 2d 3e 70 67 6e 6f 2c 20 73 71 6c 69 74 65 33 50  ->pgno, sqlite3P
11d0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
11e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 0a  pBt->pPager, 0).
11f0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e    );.  sqlite3En
1200: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1210: 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20  .  if( zMsg ){. 
1220: 20 20 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74     sqlite3Report
1230: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52  Error(SQLITE_COR
1240: 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d  RUPT, lineno, zM
1250: 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  sg);.  }.  sqlit
1260: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
1270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 23  ORRUPT_BKPT;.}.#
1290: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43   define SQLITE_C
12a0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d 65 6d  ORRUPT_PAGE(pMem
12b0: 50 61 67 65 29 20 63 6f 72 72 75 70 74 50 61 67  Page) corruptPag
12c0: 65 45 72 72 6f 72 28 5f 5f 4c 49 4e 45 5f 5f 2c  eError(__LINE__,
12d0: 20 70 4d 65 6d 50 61 67 65 29 0a 23 65 6c 73 65   pMemPage).#else
12e0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
12f0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d  _CORRUPT_PAGE(pM
1300: 65 6d 50 61 67 65 29 20 53 51 4c 49 54 45 5f 43  emPage) SQLITE_C
1310: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 4d 65 6d  ORRUPT_PGNO(pMem
1320: 50 61 67 65 2d 3e 70 67 6e 6f 29 0a 23 65 6e 64  Page->pgno).#end
1330: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1340: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1350: 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53 51 4c  ACHE..#ifdef SQL
1360: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1380: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
1390: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
13a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  t() statement. *
13b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  **.**.** Check t
13c0: 6f 20 73 65 65 20 69 66 20 70 42 74 72 65 65 20  o see if pBtree 
13d0: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
13e0: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
13f0: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
1400: 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74 68 20   .** table with 
1410: 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 2e  root page iRoot.
1420: 20 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69     Return 1 if i
1430: 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69 66 20  t does and 0 if 
1440: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  not..**.** For e
1450: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69  xample, when wri
1460: 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1470: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
1480: 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42 74 72  Root via .** Btr
1490: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42  ee connection pB
14a0: 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  tree:.**.**    a
14b0: 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
14c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
14d0: 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c  Btree, iRoot, 0,
14e0: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a   WRITE_LOCK) );.
14f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69 74 69  **.** When writi
1500: 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 74  ng to an index t
1510: 68 61 74 20 72 65 73 69 64 65 73 20 69 6e 20 61  hat resides in a
1520: 20 73 68 61 72 61 62 6c 65 20 64 61 74 61 62 61   sharable databa
1530: 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  se, the .** call
1540: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66  er should have f
1550: 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20 61 20  irst obtained a 
1560: 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e 67 20  lock specifying 
1570: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1580: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
1590: 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54 68 69  nding table. Thi
15a0: 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 61  s makes things a
15b0: 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 69   bit more compli
15c0: 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74 68 69  cated,.** as thi
15d0: 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74 73 20  s module treats 
15e0: 65 61 63 68 20 74 61 62 6c 65 20 61 73 20 61 20  each table as a 
15f0: 73 65 70 61 72 61 74 65 20 73 74 72 75 63 74 75  separate structu
1600: 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69 6e 65  re. To determine
1610: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f  .** the table co
1620: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1630: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 77  he index being w
1640: 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a 2a 20  ritten, this.** 
1650: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
1660: 73 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74  search through t
1670: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1680: 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ma..**.** Instea
1690: 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  d of a lock on t
16a0: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 72  he table/index r
16b0: 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52  ooted at page iR
16c0: 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  oot, the caller 
16d0: 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72  may.** hold a wr
16e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28 72 6f  schema table (ro
1700: 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68 69 73  ot page 1). This
1710: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65   is also.** acce
1720: 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ptable..*/.stati
1730: 63 20 69 6e 74 20 68 61 73 53 68 61 72 65 64 43  c int hasSharedC
1740: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20  acheTableLock(. 
1750: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
1760: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1770: 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f 6c 64  e that must hold
1780: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20   lock */.  Pgno 
1790: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
17a0: 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17b0: 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  f b-tree */.  in
17c0: 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20 20 20  t isIndex,      
17d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17e0: 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f  iRoot is the roo
17f0: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 2d  t of an index b-
1800: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c  tree */.  int eL
1810: 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20 20 20  ockType         
1820: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c 6f 63   /* Required loc
1830: 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c 4f 43  k type (READ_LOC
1840: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1850: 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20   */.){.  Schema 
1860: 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63 68 65  *pSchema = (Sche
1870: 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70 42 74  ma *)pBtree->pBt
1880: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e  ->pSchema;.  Pgn
1890: 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20 42 74  o iTab = 0;.  Bt
18a0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20  Lock *pLock;..  
18b0: 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
18c0: 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61 72 65  ase is not share
18d0: 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68 65 20  able, or if the 
18e0: 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e  client is readin
18f0: 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73 20 74  g.  ** and has t
1900: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
1910: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1920: 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20 72 65  en no lock is re
1930: 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20 52 65  quired. .  ** Re
1940: 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65 64 69  turn true immedi
1950: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
1960: 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61  ( (pBtree->shara
1970: 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65  ble==0).   || (e
1980: 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c  LockType==READ_L
1990: 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e  OCK && (pBtree->
19a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29  TE_ReadUncommit)
19c0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
19d0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
19e0: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
19f0: 72 65 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74  reading  or writ
1a00: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ing an index and
1a10: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20   the schema is. 
1a20: 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20   ** not loaded, 
1a30: 74 68 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64  then it is too d
1a40: 69 66 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75  ifficult to actu
1a50: 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65  ally check to se
1a60: 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e if.  ** the co
1a70: 72 72 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20  rrect locks are 
1a80: 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  held.  So do not
1a90: 20 62 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72   bother - just r
1aa0: 65 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a  eturn true..  **
1ab0: 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20   This case does 
1ac0: 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79  not come up very
1ad0: 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20   often anyhow.. 
1ae0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65   */.  if( isInde
1af0: 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c  x && (!pSchema |
1b00: 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  | (pSchema->sche
1b10: 6d 61 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  maFlags&DB_Schem
1b20: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1b30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b40: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1b50: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
1b60: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
1b70: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
1b80: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
1b90: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
1ba0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1bb0: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1bc0: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1bd0: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1be0: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1bf0: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1c00: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1c10: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1c20: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1c30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1c40: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
1c50: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
1c60: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
1c70: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
1c80: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
1c90: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1ca0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1cb0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1cd0: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1ce0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
1cf0: 20 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20   iTab ){.       
1d00: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
1d10: 65 20 69 6e 64 65 78 65 73 20 73 68 61 72 65 20  e indexes share 
1d20: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1d30: 67 65 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a  ge.  There must.
1d40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
1d50: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1d60: 20 20 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e    So just return
1d70: 20 74 72 75 65 2e 20 20 54 68 65 20 61 73 73 65   true.  The asse
1d80: 72 74 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  rt is not.      
1d90: 20 20 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e      ** useful in
1da0: 20 74 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20   that case. */. 
1db0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dc0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1dd0: 20 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78       iTab = pIdx
1de0: 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a  ->pTable->tnum;.
1df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20  }else{.    iTab 
1e10: 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20  = iRoot;.  }..  
1e20: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
1e30: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1e40: 20 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d   Either a write-
1e50: 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67  lock on root-pag
1e60: 65 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20  e iTab, a .  ** 
1e70: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1e80: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20  e schema table, 
1e90: 6f 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e  or (if the clien
1ea0: 74 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a  t is reading) a.
1eb0: 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f    ** read-lock o
1ec0: 6e 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66  n iTab will suff
1ed0: 69 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66  ice. Return 1 if
1ee0: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72   any of these ar
1ef0: 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66  e found.  */.  f
1f00: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d  or(pLock=pBtree-
1f10: 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  >pBt->pLock; pLo
1f20: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
1f30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1f40: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
1f50: 70 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20  pBtree .     && 
1f60: 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d  (pLock->iTable==
1f70: 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e  iTab || (pLock->
1f80: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f90: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  K && pLock->iTab
1fa0: 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20  le==1)).     && 
1fb0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  pLock->eLock>=eL
1fc0: 6f 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a  ockType .    ){.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ff0: 46 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74  Failed to find t
2000: 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
2010: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
2020: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2030: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
2040: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2050: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
2060: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75  unction may be u
2070: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
2080: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2090: 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a  ts only. ****.**
20a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
20b0: 69 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  if it would be i
20c0: 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65  llegal for pBtre
20d0: 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
20e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  the.** table or 
20f0: 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20  index rooted at 
2100: 69 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74  iRoot because ot
2110: 68 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  her shared conne
2120: 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69  ctions are.** si
2130: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61  multaneously rea
2140: 64 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74  ding that same t
2150: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
2160: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
2170: 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f  al for pBtree to
2180: 20 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f   write if some o
2190: 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63  ther Btree objec
21a0: 74 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73  t that.** shares
21b0: 20 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72   the same BtShar
21c0: 65 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72  ed object is cur
21d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
21e0: 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  r writing.** the
21f0: 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45   iRoot table.  E
2200: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74  xcept, if the ot
2210: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
2220: 20 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64   has the.** read
2230: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
2240: 67 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69  g set, then it i
2250: 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68  s OK for the oth
2260: 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  er object to.** 
2270: 68 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73  have a read curs
2280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  or..**.** For ex
2290: 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72  ample, before wr
22a0: 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72  iting to any par
22b0: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  t of the table o
22c0: 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65  r index.** roote
22d0: 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c  d at page iRoot,
22e0: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c   one should call
22f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72  :.**.**    asser
2300: 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  t( !hasReadConfl
2310: 69 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f  icts(pBtree, iRo
2320: 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  ot) );.*/.static
2330: 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66   int hasReadConf
2340: 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74  licts(Btree *pBt
2350: 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29  ree, Pgno iRoot)
2360: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2370: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
2380: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
2390: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
23a0: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
23b0: 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20  ot==iRoot .     
23c0: 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42  && p->pBtree!=pB
23d0: 74 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d  tree.     && 0==
23e0: 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  (p->pBtree->db->
23f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
2400: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a 20 20 20  eadUncommit).   
2410: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2420: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2430: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
2440: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
2450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
2460: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
2470: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
2480: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
2490: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24a0: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
24b0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
24c0: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
24d0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
24e0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
24f0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2500: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
2510: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
2520: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
2530: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
2540: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
2550: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
2560: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
2570: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2580: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2590: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
25a0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
25b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
25c0: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
25d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
25e0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
25f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2600: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2610: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2620: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2630: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
2640: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
2650: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2660: 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c 65 4c 6f  adUncommit)||eLo
2670: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
2680: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
2690: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
26a0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
26b0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
26c0: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
26d0: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
26e0: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
26f0: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
2700: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
2710: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
2720: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
2730: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
2740: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
2750: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2760: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2770: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
2780: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
2790: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
27a0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
27b0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
27c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
27d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27e0: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
27f0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2800: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
2810: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
2820: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
2830: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2840: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2860: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
2870: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2880: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
2890: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
28a0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
28b0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
28c0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
28d0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
28e0: 69 74 65 72 21 3d 70 20 26 26 20 28 70 42 74 2d  iter!=p && (pBt-
28f0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2900: 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 7b  EXCLUSIVE)!=0 ){
2910: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
2920: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
2930: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
2940: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
2950: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2960: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2970: 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  }..  for(pIter=p
2980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
2990: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
29a0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Next){.    /* Th
29b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74  e condition (pIt
29c0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
29d0: 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ) in the followi
29e0: 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20  ng if(...) .    
29f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ** statement is 
2a00: 61 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  a simplification
2a10: 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2a20: 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49  **   (eLock==WRI
2a30: 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  TE_LOCK || pIter
2a40: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
2a50: 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  OCK).    **.    
2a60: 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2a70: 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d   that if eLock==
2a80: 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e  WRITE_LOCK, then
2a90: 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2aa0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20  tion.    ** may 
2ab0: 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43  hold a WRITE_LOC
2ac0: 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69  K on any table i
2ad0: 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e  n this file (sin
2ae0: 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20  ce there can.   
2af0: 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69   ** only be a si
2b00: 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20  ngle writer)..  
2b10: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2b20: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
2b30: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
2b40: 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  r->eLock==WRITE_
2b50: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
2b60: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
2b70: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70  LOCK || pIter->p
2b80: 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65  Btree==p || pIte
2b90: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2ba0: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49  OCK);.    if( pI
2bb0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
2bc0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
2bd0: 3d 69 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e  =iTab && pIter->
2be0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a  eLock!=eLock ){.
2bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
2c00: 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
2c10: 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74  ->db, pIter->pBt
2c20: 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  ree->db);.      
2c30: 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45  if( eLock==WRITE
2c40: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
2c50: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d   assert( p==pBt-
2c60: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
2c70: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
2c80: 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47  s |= BTS_PENDING
2c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2cb0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
2cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ce0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2cf0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2d00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2d20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2d30: 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   Add a lock on t
2d40: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2d50: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74  ot-page iTable t
2d60: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
2d70: 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74  ee used.** by Bt
2d80: 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61  ree handle p. Pa
2d90: 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75  rameter eLock mu
2da0: 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41  st be either REA
2db0: 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52  D_LOCK or .** WR
2dc0: 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ITE_LOCK..**.** 
2dd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2de0: 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sumes the follow
2df0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29  ing:.**.**   (a)
2e00: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 42   The specified B
2e10: 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69 73  tree object p is
2e20: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
2e30: 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20  sharable.**     
2e40: 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65 20    database (one 
2e50: 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72 65  with the BtShare
2e60: 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67 20  d.sharable flag 
2e70: 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  set), and.**.** 
2e80: 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20 42    (b) No other B
2e90: 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c  tree objects hol
2ea0: 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f  d a lock that co
2eb0: 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20  nflicts.**      
2ec0: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
2ed0: 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71  ted lock (i.e. q
2ee0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2ef0: 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a  ableLock() has.*
2f00: 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20  *       already 
2f10: 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20  been called and 
2f20: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
2f30: 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OK)..**.** SQLIT
2f40: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f50: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
2f60: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
2f70: 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ly. SQLITE_NOMEM
2f80: 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64   .** is returned
2f90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74   if a malloc att
2fa0: 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  empt fails..*/.s
2fb0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
2fc0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2fd0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2fe0: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
2ff0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
3000: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
3010: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3020: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
3030: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
3040: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3050: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
3060: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
3070: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
3080: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
3090: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
30a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e  0 );..  /* A con
30b0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  nection with the
30c0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
30d0: 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20  d flag set will 
30e0: 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a  never try to.  *
30f0: 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d  * obtain a read-
3100: 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20  lock using this 
3110: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e  function. The on
3120: 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74  ly read-lock obt
3130: 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20  ained.  ** by a 
3140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65  connection in re
3150: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d  ad-uncommitted m
3160: 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71  ode is on the sq
3170: 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a  lite_master .  *
3180: 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61  * table, and tha
3190: 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  t lock is obtain
31a0: 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e  ed in BtreeBegin
31b0: 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61  Trans().  */.  a
31c0: 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62  ssert( 0==(p->db
31d0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
31e0: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 7c 7c 20  eadUncommit) || 
31f0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
3200: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
3210: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
3220: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
3230: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
3240: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
3250: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
3260: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
3270: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
3280: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
3290: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
32a0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
32b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
32c0: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
32d0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
32e0: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
32f0: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
3300: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
3310: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
3320: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
3330: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
3340: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
3350: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
3360: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
3370: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
3380: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
3390: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
33a0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
33b0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
33c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
33d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
33e0: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
33f0: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
3400: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
3410: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
3420: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
3430: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
3440: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
3450: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
3460: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
3470: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
3480: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
3490: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
34a0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
34b0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
34c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34d0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
34e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
34f0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
3500: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
3510: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
3520: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
3530: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
3540: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
3550: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
3560: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
3570: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
3580: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3590: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
35a0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
35b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
35c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
35d0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
35e0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
35f0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
3600: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
3610: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
3620: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
3630: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
3640: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
3650: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
3660: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
3670: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
3680: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
3690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
36a0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
36b0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
36c0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
36d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
36e0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
36f0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
3700: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
3710: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
3720: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
3730: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
3740: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
3750: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
3760: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
3770: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
3780: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
3790: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
37a0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
37b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37c0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
37d0: 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44  hen the BTS_PEND
37e0: 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20  ING flag.** may 
37f0: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
3800: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
3810: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
3820: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3830: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3840: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3850: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
3860: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
3870: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
3880: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
3890: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
38a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
38b0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
38c0: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
38d0: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
38e0: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
38f0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
3900: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
3910: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
3920: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
3930: 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45   & BTS_EXCLUSIVE
3940: 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72  )==0 || pBt->pWr
3950: 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  iter==pLock->pBt
3960: 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ree );.    asser
3970: 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  t( pLock->pBtree
3980: 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b  ->inTrans>=pLock
3990: 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ->eLock );.    i
39a0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
39b0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
39c0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
39d0: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
39e0: 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  t( pLock->iTable
39f0: 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70  !=1 || pLock==&p
3a00: 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  ->lock );.      
3a10: 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  if( pLock->iTabl
3a20: 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=1 ){.        
3a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
3a40: 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ck);.      }.   
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
3a60: 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70  Iter = &pLock->p
3a70: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
3a80: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
3a90: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
3aa0: 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70  PENDING)==0 || p
3ab0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
3ac0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3ad0: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d  r==p ){.    pBt-
3ae0: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3af0: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3b00: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3b10: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3b20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74  .  }else if( pBt
3b30: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
3b40: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  2 ){.    /* This
3b50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3b60: 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70  led when Btree p
3b70: 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69   is concluding i
3b80: 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ts .    ** trans
3b90: 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  action. If there
3ba0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
3bb0: 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20  s a writer, and 
3bc0: 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  p is not.    ** 
3bd0: 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65  that writer, the
3be0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3bf0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
3c00: 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a  nnections other.
3c10: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
3c20: 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61  writer must be a
3c30: 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20  bout to drop to 
3c40: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
3c50: 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  se.    ** set th
3c60: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3c70: 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a  ag to 0..    **.
3c80: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
3c90: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
3ca0: 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20   a writer, then 
3cb0: 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74  BTS_PENDING must
3cc0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
3cd0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
3ce0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
3cf0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
3d00: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3d10: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
3d20: 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20   ~BTS_PENDING;. 
3d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3d40: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
3d50: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
3d60: 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  s held by Btree 
3d70: 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b  p into read-lock
3d80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3d90: 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  d downgradeAllSh
3da0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3db0: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
3dc0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
3dd0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
3de0: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3df0: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
3e00: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57  ock;.    pBt->pW
3e10: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3e20: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3e30: 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c  ~(BTS_EXCLUSIVE|
3e40: 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20  BTS_PENDING);.  
3e50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d    for(pLock=pBt-
3e60: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
3e70: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
3e80: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
3e90: 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d  ( pLock->eLock==
3ea0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  READ_LOCK || pLo
3eb0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b  ck->pBtree==p );
3ec0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c  .      pLock->eL
3ed0: 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
3ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
3ef0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
3f00: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
3f10: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3f20: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
3f30: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
3f40: 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72 64        /* Forward
3f50: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3f60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
3f70: 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
3f80: 20 2a 70 50 61 67 65 29 3b 20 20 20 20 20 20 2f   *pPage);      /
3f90: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
3fa0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
3fb0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
3fc0: 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
3fd0: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
3fe0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3ff0: 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72  ./*.***** This r
4000: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69  outine is used i
4010: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
4020: 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a  ) only ****.**.*
4030: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4040: 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74  e cursor holds t
4050: 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20  he mutex on its 
4060: 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64  BtShared.*/.#ifd
4070: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4080: 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f  static int curso
4090: 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75  rHoldsMutex(BtCu
40a0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  rsor *p){.  retu
40b0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
40c0: 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
40d0: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69  tex);.}../* Veri
40e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
40f0: 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68 61  or and the BtSha
4100: 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74 20  red agree about 
4110: 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72 72  what is the curr
4120: 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
4130: 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20  connetion. This 
4140: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20  is important in 
4150: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
4160: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
4170: 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  se .** connectio
4180: 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f  n pointers get o
4190: 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69  ut-of-sync, it i
41a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  s possible for r
41b0: 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20  outines like.** 
41c0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
41d0: 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20  to reference an 
41e0: 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  stale connection
41f0: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65   pointer that re
4200: 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20  ferences a.** a 
4210: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
4220: 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73  has already clos
4230: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
4240: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
4250: 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
4260: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64  tements only and
4270: 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
4280: 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   of double-check
4290: 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74 72  ing that the btr
42a0: 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20  ee code.** does 
42b0: 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61 73  keep the databas
42c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69  e connection poi
42d0: 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65  nters up-to-date
42e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42f0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
4300: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ed(BtCursor *p){
4310: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
4320: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  rHoldsMutex(p) )
4330: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  ;.  return (p->p
4340: 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42  Btree->db==p->pB
4350: 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  t->db);.}.#endif
4360: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
4370: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
4380: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
4390: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
43a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
43b0: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
43c0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
43d0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
43e0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
43f0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4400: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
4410: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
4420: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
4430: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
4440: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
4450: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
4460: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
4470: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
4480: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
4490: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
44a0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
44b0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
44c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
44d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
44e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
44f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4500: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
4510: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
4520: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
4530: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4540: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
4550: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4560: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
4570: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4580: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
4590: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
45a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
45b0: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
45c0: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
45d0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
45e0: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
45f0: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
4600: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
4610: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
4620: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
4630: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
4640: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
4650: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
4660: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
4670: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
4680: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
4690: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
46a0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
46b0: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
46c0: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
46d0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
46e0: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
46f0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
4700: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
4710: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
4720: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
4730: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
4740: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
4750: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
4760: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4770: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
4780: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
4790: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
47a0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
47b0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
47c0: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
47d0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
47e0: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
47f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4800: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
4810: 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  heck */.  Pgno p
4820: 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  gnoRoot,        
4830: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
4840: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
4850: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69  nging */.  i64 i
4860: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
4870: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
4880: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
4890: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
48a0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
48b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
48c0: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
48d0: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
48e0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
48f0: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
4900: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
4910: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4920: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4930: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
4940: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
4950: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
4960: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
4970: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
4980: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
4990: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
49a0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
49b0: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
49c0: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
49d0: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
49e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
49f0: 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26  Root==pgnoRoot &
4a00: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
4a10: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
4a20: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
4a30: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4a40: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4a60: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
4a70: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
4a80: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
4a90: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
4aa0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
4ab0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
4ac0: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4ae0: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4af0: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4b00: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4b10: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4b20: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4b30: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4b40: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4b50: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
4b60: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
4b70: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
4b80: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
4b90: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4ba0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
4bb0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4bc0: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4bd0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4be0: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4bf0: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4c00: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4c10: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4c20: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4c30: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4c40: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4c50: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
4c60: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
4c70: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
4c80: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4c90: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
4ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
4cb0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4cc0: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4cd0: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4ce0: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4cf0: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4d00: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4d10: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4d20: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4d30: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4d40: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4d50: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
4d60: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
4d70: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
4d80: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4d90: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
4da0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
4db0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4dc0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4dd0: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4de0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4df0: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4e00: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4e10: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4e20: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4e30: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4e40: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4e50: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
4e60: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
4e70: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
4e80: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
4e90: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
4ea0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
4eb0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4ec0: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4ed0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4ee0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4ef0: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4f00: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4f10: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4f20: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4f30: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4f40: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4f50: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4f60: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4f70: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4f80: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4f90: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4fa0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4fb0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4fc0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4fd0: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4fe0: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4ff0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
5000: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
5010: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
5020: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
5030: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
5040: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
5050: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
5060: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
5070: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
5080: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
5090: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
50a0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
50b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
50c0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
50d0: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
50e0: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
50f0: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
5100: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
5110: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
5120: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
5130: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
5140: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
5150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
5160: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
5170: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
5180: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
5190: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
51a0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
51b0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
51c0: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
51d0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
51e0: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
51f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
5200: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
5210: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
5220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5230: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
5240: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
5250: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
5260: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
5270: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
5280: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
5290: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
52a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
52b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
52c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
52d0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
52e0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
52f0: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
5300: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
5310: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
5320: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
5330: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
5340: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5350: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
5360: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5370: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
5380: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5390: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
53a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
53b0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
53c0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
53d0: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
53e0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
53f0: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
5400: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
5410: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
5420: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
5430: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
5440: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
5450: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
5460: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
5470: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
5480: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
5490: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
54a0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
54b0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
54c0: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
54d0: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
54e0: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
54f0: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5500: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5510: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5520: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5530: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5540: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5550: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
5560: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
5570: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
5580: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
5590: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
55a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
55b0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
55c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
55d0: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
55e0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
55f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5600: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5610: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5620: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5630: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5640: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5650: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5660: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
5670: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43 75  int i;.  if( pCu
56a0: 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
56b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
56c0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
56d0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
56e0: 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
56f0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
5700: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
5710: 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70  eNotNull(pCur->p
5720: 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
5730: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d  >iPage = -1;.  }
5740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
5750: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5760: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5770: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5780: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5790: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
57a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
57b0: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
57c0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
57d0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
57e0: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
57f0: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5800: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
5810: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
5820: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
5830: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
5840: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
5850: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
5860: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5870: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5880: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5890: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
58a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
58b0: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
58c0: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
58d0: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
58e0: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
58f0: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5900: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
5910: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
5920: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
5930: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
5940: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
5950: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
5960: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5970: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5980: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5990: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
59a0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
59b0: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
59c0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
59d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
59e0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
59f0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5a00: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5a10: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5a30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5a40: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5a50: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5a60: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5a70: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5a80: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5a90: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5aa0: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5ab0: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5ac0: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5ad0: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5ae0: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5af0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5b00: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
5b10: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
5b20: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5b30: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5b40: 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20  Size(pCur);.    
5b50: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
5b60: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5b70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5b80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5b90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5ba0: 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ad(pCur, 0, (int
5bb0: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5bc0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5bd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5be0: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5bf0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
5c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5c40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
5c50: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
5c60: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5c70: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5c80: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5c90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5ca0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5cb0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5cc0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5cd0: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5ce0: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5cf0: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5d00: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
5d10: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
5d20: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
5d30: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
5d40: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
5d50: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
5d60: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5d70: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5d80: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5d90: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5db0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5dc0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5dd0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5de0: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5df0: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5e00: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5e10: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5e30: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5e40: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5e50: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5e60: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5e80: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5e90: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5ea0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5eb0: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5ec0: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5ed0: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5ee0: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5f00: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
5f10: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
5f20: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
5f30: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5f40: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5f50: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
5f60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5f70: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5f80: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5f90: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5fa0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5fb0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5fd0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5fe0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5ff0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
6000: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
6010: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
6020: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
6030: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
6040: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
6050: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
6060: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
6070: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
6080: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
6090: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
60a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
60b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
60c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
60d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
60e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
60f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
6100: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
6110: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
6120: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
6130: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
6140: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
6150: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
6160: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
6170: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
6180: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
6190: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
61a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
61b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
61c0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
61d0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
61e0: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
61f0: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
6200: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
6210: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
6220: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
6230: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
6240: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
6250: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
6260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
6270: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
6280: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
6290: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
62a0: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
62b0: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
62c0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
62d0: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
62e0: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
62f0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
6300: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
6310: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
6320: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
6330: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
6340: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
6350: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
6360: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
6370: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
6380: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
6390: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
63a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
63b0: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
63c0: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
63d0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
63e0: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
63f0: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
6400: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
6410: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
6420: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
6430: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
6440: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
6450: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
6460: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
6470: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
6480: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
6490: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
64a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
64b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
64c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
64d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
64e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
64f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
6500: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
6510: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
6520: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6530: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6540: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6550: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6560: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
6570: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
6580: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
6590: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
65a0: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
65b0: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
65c0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
65d0: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
65e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
65f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
6600: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
6610: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
6620: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
6630: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
6640: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
6650: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
6660: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6670: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6680: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6690: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
66a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
66b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
66c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
66d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
66e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
66f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6700: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
6710: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
6720: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
6730: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
6740: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
6750: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
6760: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6770: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6780: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6790: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
67a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
67b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
67c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
67d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
67e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
67f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6800: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
6810: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
6820: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6830: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6840: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6850: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
6860: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6870: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6880: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6890: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
68a0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
68b0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
68c0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
68d0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
68e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
68f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
6910: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
6920: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62  >=0 );.        b
6930: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
6940: 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20  rsorPages(p);.  
6950: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6960: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
6970: 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72  }while( p );.  r
6980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
69a0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
69b0: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
69c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
69d0: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
69e0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
69f0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6a00: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6a10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
6a20: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6a30: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6a40: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
6a50: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
6a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
6a70: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
6a80: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
6a90: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
6aa0: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
6ab0: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
6ac0: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
6ad0: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
6ae0: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
6af0: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
6b00: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
6b10: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
6b20: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
6b30: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
6b40: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
6b50: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
6b60: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
6b70: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
6b80: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
6b90: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
6ba0: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
6bb0: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
6bc0: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
6bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
6be0: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
6bf0: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
6c00: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
6c10: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
6c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
6c30: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
6c40: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
6c50: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
6c60: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
6c70: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
6c80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
6cb0: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
6cc0: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
6cd0: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
6ce0: 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28  ex key */..  if(
6cf0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
6d00: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6d10: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6d20: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6d30: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
6d40: 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e  kedRecord(pCur->
6d50: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6d60: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6d80: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6d90: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6da0: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6db0: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6dc0: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6dd0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
6de0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
6df0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6e00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6e10: 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
6e20: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _done;.    }.  }
6e30: 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
6e40: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
6e50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
6e60: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
6e70: 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
6e80: 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d  , bias, pRes);.m
6e90: 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66  oveto_done:.  if
6ea0: 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6ec0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6ed0: 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  b, pIdxKey);.  }
6ee0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6ef0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6f00: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6f10: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6f20: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6f30: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6f40: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6f50: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6f60: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
6f70: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
6f80: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
6f90: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
6fa0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
6fb0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6fc0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6fd0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6fe0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6ff0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
7000: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
7010: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
7020: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
7030: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
7040: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
7050: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
7060: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
7070: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
7080: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
7090: 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
70a0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
70b0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
70c0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
70d0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
70e0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
70f0: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
7100: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
7110: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
7120: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7130: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
7140: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
7150: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
7160: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
7170: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
7180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7190: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
71a0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
71b0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
71c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
71d0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
71e0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
71f0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7200: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
7210: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
7220: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
7230: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
7240: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
7250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7260: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
7270: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7280: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
7290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
72a0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
72b0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
72c0: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
72d0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
72e0: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
72f0: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
7300: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7310: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
7320: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
7330: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
7340: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
7350: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
7360: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
7370: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
7380: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
7390: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
73a0: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
73b0: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
73c0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
73d0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
73e0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
73f0: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
7400: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
7410: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
7420: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
7430: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
7440: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
7450: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
7460: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
7470: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
7480: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
7490: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
74a0: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
74b0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
74c0: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
74d0: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
74e0: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
74f0: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
7500: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
7510: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7520: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
7530: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7540: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
7550: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
7560: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
7570: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
75a0: 61 6b 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  ake BtCursor obj
75b0: 65 63 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c  ect that will al
75c0: 77 61 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66  ways answer.** f
75d0: 61 6c 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69  alse to the sqli
75e0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
75f0: 73 4d 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65  sMoved() routine
7600: 20 61 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b   above.  The fak
7610: 65 0a 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75  e.** cursor retu
7620: 72 6e 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65  rned must not be
7630: 20 75 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f   used with any o
7640: 74 68 65 72 20 42 74 72 65 65 20 69 6e 74 65 72  ther Btree inter
7650: 66 61 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f  face..*/.BtCurso
7660: 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46  r *sqlite3BtreeF
7670: 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76  akeValidCursor(v
7680: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75  oid){.  static u
7690: 38 20 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43  8 fakeCursor = C
76a0: 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61  URSOR_VALID;.  a
76b0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
76c0: 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65  BtCursor, eState
76d0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
76e0: 20 28 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b   (BtCursor*)&fak
76f0: 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eCursor;.}../*.*
7700: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7710: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7720: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7730: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7740: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
7750: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
7760: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
7770: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
7780: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
7790: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
77a0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
77b0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
77c0: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
77d0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
77e0: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
77f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7800: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7810: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7820: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7830: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7840: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
7850: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
7860: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
7870: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
7880: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
7890: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
78a0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
78b0: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
78c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
78d0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
78e0: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
78f0: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7900: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7910: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7920: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7940: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
7950: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
7960: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
7970: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
7980: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
7990: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
79a0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
79b0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
79c0: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
79d0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
79e0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
79f0: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7a00: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7a10: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7a20: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7a30: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7a40: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a50: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
7a60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7a70: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
7a80: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7a90: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
7aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ab0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7ac0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7ad0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7ae0: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7af0: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7b00: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7b10: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7b20: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7b30: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7b40: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
7b50: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
7b60: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
7b70: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
7b80: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
7b90: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
7ba0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7bb0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7bc0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7bd0: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7be0: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7bf0: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7c00: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7c10: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7c20: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7c30: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7c40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
7c50: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
7c60: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
7c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
7c80: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
7c90: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
7ca0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7cb0: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7cc0: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7cd0: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7ce0: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7cf0: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7d00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7d10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7d20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7d30: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7d40: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
7d50: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
7d60: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
7d70: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
7d80: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
7d90: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
7da0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7db0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7dc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7dd0: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7de0: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7df0: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7e00: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7e20: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7e30: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7e40: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
7e50: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
7e60: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
7e70: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
7e80: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
7e90: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
7ea0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7eb0: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7ec0: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7ed0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7ee0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7ef0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7f00: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7f10: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7f20: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7f30: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7f40: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
7f50: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
7f60: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
7f70: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
7f80: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
7f90: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
7fa0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7fb0: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7fc0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7fd0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7fe0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7ff0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
8000: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8010: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
8020: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
8030: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
8040: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
8050: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
8060: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
8070: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
8080: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
8090: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
80a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
80b0: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
80c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
80d0: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
80e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
80f0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8100: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
8110: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
8120: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
8130: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
8140: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
8150: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
8160: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
8170: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
8180: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
8190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
81a0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
81b0: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
81c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
81d0: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
81e0: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
81f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
8210: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8220: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
8230: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8240: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8250: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
8260: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
8270: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
8280: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
8290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
82a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
82b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
82c0: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
82d0: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
82e0: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
82f0: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
8300: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
8310: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
8320: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
8330: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8340: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
8350: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
8360: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
8370: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8380: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8390: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
83a0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
83b0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
83c0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
83d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
83e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
83f0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8400: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
8410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8420: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
8430: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
8440: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
8450: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
8460: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
8470: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
8480: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
8490: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
84a0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
84b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
84c0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
84d0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
84e0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
84f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8500: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8510: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
8520: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
8530: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
8540: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
8550: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
8560: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
8570: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
8580: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
8590: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
85a0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
85b0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
85c0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
85d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
85e0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
85f0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
8600: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
8610: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
8620: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
8630: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
8640: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
8650: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
8660: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
8670: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
8680: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
8690: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
86a0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
86b0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
86c0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
86d0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
86e0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
86f0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8700: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8710: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8720: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8730: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8740: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
8750: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
8760: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
8770: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
8780: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8790: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
87a0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
87b0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
87c0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
87d0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
87e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
87f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8800: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8810: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8820: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8830: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8840: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
8850: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
8860: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8870: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
8880: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8890: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
88a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
88b0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
88c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
88d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
88e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
88f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8900: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8910: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8920: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8930: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8940: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
8950: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8960: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8970: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8980: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8990: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
89a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
89b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
89c0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
89e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
89f0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8a00: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8a10: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8a20: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8a30: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
8a50: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
8a60: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8a70: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8a80: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8a90: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8aa0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8ab0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8ac0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8ad0: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74  CORRUPT_PGNO(iPt
8ae0: 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  rmap);.  return 
8af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
8b00: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
8b10: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
8b20: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
8b30: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
8b40: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
8b50: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
8b60: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
8b70: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
8b80: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
8b90: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
8ba0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8bb0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8bc0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8bd0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8be0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8bf0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8c00: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8c10: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8c20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8c30: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8c40: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8c50: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8c60: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8c70: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8c80: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8c90: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8ca0: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8cb0: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8cc0: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8cd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8ce0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8cf0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8d00: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8d10: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8d20: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
8d30: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
8d40: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8d50: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8d60: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8d70: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
8d80: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
8d90: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
8da0: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
8db0: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8dc0: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8dd0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8de0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
8df0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
8e00: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
8e10: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
8e20: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
8e30: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8e40: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
8e50: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
8e60: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
8e70: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
8e80: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
8e90: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
8ea0: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
8eb0: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
8ec0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
8ed0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8ee0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
8ef0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
8f00: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
8f10: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
8f20: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8f30: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8f40: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8f50: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8f60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8f70: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8f80: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8f90: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8fa0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8fb0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8fc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8fd0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8fe0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8ff0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
9000: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
9010: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
9020: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9030: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9040: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9060: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9070: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9080: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9090: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
90a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
90b0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
90c0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
90d0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
90e0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
90f0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
9100: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
9110: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
9120: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9130: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9140: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9150: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9160: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9170: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9180: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9190: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
91a0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
91b0: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
91c0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
91d0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
91e0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
91f0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9200: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
9210: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9220: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9230: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9240: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9250: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9260: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9270: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9280: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9290: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
92a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
92b0: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
92c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
92d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
92e0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
92f0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9300: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
9310: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
9320: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9330: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9340: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9350: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9360: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9370: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9380: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9390: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
93a0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
93b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
93c0: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
93d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
93e0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
93f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9400: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
9410: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
9420: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9430: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9440: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9450: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9460: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9470: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9480: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9490: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
94a0: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
94b0: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
94c0: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
94d0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
94e0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
94f0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9500: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
9510: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
9520: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9530: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9540: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9550: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9560: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9570: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9580: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9590: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
95a0: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
95b0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
95c0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
95d0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
95e0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
95f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9600: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9610: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9620: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9630: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9640: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9650: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9660: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9670: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9680: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9690: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
96b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
96c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
96d0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
96e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
96f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
9700: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9710: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9720: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9730: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9740: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9750: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9760: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9770: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9780: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9790: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
97a0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
97b0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
97c0: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
97d0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
97e0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
97f0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9800: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9810: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9820: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9840: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9850: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9860: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9870: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9880: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9890: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98b0: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
98c0: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
98d0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
98e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
98f0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9900: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9910: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9920: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9930: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9940: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9950: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9960: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9970: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9980: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9990: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
99a0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
99b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
99c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
99d0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
99e0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
99f0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9a00: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9a10: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9a20: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9a30: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9a40: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9a50: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9a60: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9a70: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9a80: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9a90: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9aa0: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9ab0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9ac0: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9ad0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9ae0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9af0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9b00: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9b10: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9b20: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9b30: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9b40: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9b50: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9b60: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9b70: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9b80: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9b90: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9ba0: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9bb0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9bc0: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9bd0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9be0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9bf0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9c00: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9c10: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9c20: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9c30: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9c40: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9c50: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9c60: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9c70: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9c80: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9c90: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9cb0: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9cc0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9cd0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9ce0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9cf0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9d00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d20: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9d30: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
9d40: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
9d50: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9d60: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9d70: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9d80: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9d90: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9da0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9db0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9dc0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9dd0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9de0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9df0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9e00: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9e10: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9e20: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9e30: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9e40: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9e50: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9e60: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9e70: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9e80: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9e90: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9ea0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9eb0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9ec0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9ed0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9ee0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9ef0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
9f00: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
9f10: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
9f20: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
9f30: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
9f40: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
9f50: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9f60: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
9f70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9f80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9f90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9fa0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9fb0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9fc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9fd0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
9fe0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
9ff0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a000: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a010: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a020: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a030: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a040: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a050: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a060: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a070: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a080: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a090: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a0a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a0b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a0c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a0d0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a0e0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a0f0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a100: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a110: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a120: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a130: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a140: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a150: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a160: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a170: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a180: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a190: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a1a0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a1b0: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a1c0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a1d0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a1e0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a1f0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a200: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a210: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a220: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a230: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a240: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a250: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a260: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a270: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a280: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a290: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a2a0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a2b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a2c0: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a2d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a2e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a2f0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a300: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a310: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a320: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a330: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a340: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a350: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a360: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a370: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a380: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a390: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a3a0: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a3b0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a3c0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a3d0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a3f0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a400: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a410: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a420: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a430: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a440: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a450: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a460: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a470: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a480: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a4a0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a4b0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a4c0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a4d0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a4e0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a4f0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a500: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a510: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a520: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a530: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a550: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a560: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a570: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a580: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a590: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a5a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a5b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a5c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a5d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a5e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a5f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a600: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a610: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a620: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a630: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a640: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a650: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a660: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a670: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a680: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a690: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a6a0: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a6b0: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a6c0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a6e0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a6f0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a700: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a710: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a720: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a730: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a740: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a750: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a760: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
a770: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a780: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a790: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a7c0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a7d0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a800: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
a810: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
a820: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
a830: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a840: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
a850: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
a860: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
a870: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
a880: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
a890: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
a8a0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
a8b0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
a8c0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
a8d0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
a8e0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
a8f0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
a900: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
a910: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
a920: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
a930: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
a940: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a950: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a960: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a970: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a980: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
a990: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
a9a0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
a9b0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
a9c0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
a9d0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
a9e0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
a9f0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
aa00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
aa10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
aa20: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
aa30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
aa50: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
aa60: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
aa70: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
aa80: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
aa90: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
aaa0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
aab0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
aac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
aad0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
aae0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
aaf0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
ab00: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ab10: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
ab20: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ab30: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ab40: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ab50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ab60: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ab70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ab80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ab90: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
aba0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
abb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
abc0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
abd0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
abe0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
abf0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
ac00: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
ac10: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
ac20: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
ac30: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
ac40: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
ac50: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
ac60: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
ac70: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
ac80: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
ac90: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
aca0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
acb0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
acc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
acd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
ace0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
acf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
ad00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
ad10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
ad20: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
ad30: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
ad40: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
ad50: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
ad60: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
ad70: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
ad80: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
ad90: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
ada0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
adb0: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
adc0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
add0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
ade0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
adf0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
ae00: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
ae10: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
ae20: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
ae30: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
ae40: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
ae50: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
ae60: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
ae70: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
ae80: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
ae90: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
aea0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
aeb0: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
aec0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
aed0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
aee0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
aef0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
af00: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
af10: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
af20: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
af30: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
af40: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
af50: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
af60: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
af70: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
af80: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
af90: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
afa0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
afb0: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
afc0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
afd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
afe0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
aff0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b000: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b010: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b020: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b030: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b040: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b050: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b060: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b070: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b080: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b090: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b0a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b0b0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b0c0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b0d0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b0e0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b0f0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b100: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b110: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b120: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b130: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b140: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b150: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b160: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b170: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b180: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b190: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
b1a0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
b1b0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
b1c0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
b1d0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
b1e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
b1f0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
b200: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
b210: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
b220: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
b230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
b240: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
b250: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
b260: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
b270: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
b280: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
b290: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
b2a0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
b2b0: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
b2c0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
b2d0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
b2e0: 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
b2f0: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
b300: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
b310: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
b320: 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20  fo.nSize-4]);.  
b330: 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67    ptrmapPut(pPag
b340: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
b350: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
b360: 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43  pPage->pgno, pRC
b370: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
b380: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
b390: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
b3a0: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
b3b0: 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c  reorganizes cell
b3c0: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
b3d0: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
b3e0: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62  re are no free-b
b3f0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65  locks on the fre
b400: 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a  e-block list..**
b410: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d  .** Parameter nM
b420: 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61  axFrag is the ma
b430: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
b440: 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  fragmented space
b450: 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
b460: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70  present in the p
b470: 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72  age after this r
b480: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
b490: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
b4a0: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
b4b0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
b4c0: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
b4d0: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
b4e0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
b4f0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
b500: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
b510: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
b520: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
b530: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
b540: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
b550: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
b560: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
b570: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
b580: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
b590: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
b5a0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
b5b0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
b5c0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61   *pPage, int nMa
b5d0: 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b  xFrag){.  int i;
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b600: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
b610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b630: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
b640: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b670: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
b680: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b6a0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
b6b0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
b6c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b6d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
b6e0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
b6f0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
b700: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
b710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b720: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
b730: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
b740: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
b750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
b760: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
b770: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
b780: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
b790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b7a0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
b7b0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
b7c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
b7d0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
b7e0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
b7f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
b800: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
b810: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
b820: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e   content */.  un
b830: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63  signed char *src
b840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ;        /* Sour
b850: 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ce of content */
b860: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
b870: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b880: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
b890: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
b8a0: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b8c0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
b8d0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73  l index */..  as
b8e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b8f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b900: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b910: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b920: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b930: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b940: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b950: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b960: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b970: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b980: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b9a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b9b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b9c0: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b9d0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b9e0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b9f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
ba00: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
ba10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
ba20: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
ba30: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
ba40: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
ba50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
ba60: 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   );.  iCellFirst
ba70: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
ba80: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c  2*nCell;.  usabl
ba90: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
baa0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
bab0: 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
bac0: 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77   handles pages w
bad0: 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72  ith two or fewer
bae0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64   free blocks and
baf0: 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f   nMaxFrag.  ** o
bb00: 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74  r fewer fragment
bb10: 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69  ed bytes. In thi
bb20: 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73  s case it is fas
bb30: 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a  ter to move the.
bb40: 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65    ** two (or one
bb50: 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c  ) blocks of cell
bb60: 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28  s using memmove(
bb70: 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65  ) and add the re
bb80: 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73  quired.  ** offs
bb90: 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e  ets to each poin
bba0: 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  ter in the cell-
bbb0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68  pointer array th
bbc0: 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a  an it is to .  *
bbd0: 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68  * reconstruct th
bbe0: 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20  e entire page.  
bbf0: 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61  */.  if( (int)da
bc00: 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46  ta[hdr+7]<=nMaxF
bc10: 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  rag ){.    int i
bc20: 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28  Free = get2byte(
bc30: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
bc40: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
bc50: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
bc60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bc70: 61 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20  a[iFree]);..    
bc80: 20 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f    /* pageFindSlo
bc90: 74 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  t() has already 
bca0: 76 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72  verified that fr
bcb0: 65 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f  ee blocks are so
bcc0: 72 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rted.      ** in
bcd0: 20 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74   order of offset
bce0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bcf0: 2c 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c  , and that no bl
bd00: 6f 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ock extends.    
bd10: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bd20: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50  d of the page. P
bd30: 72 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20  rovided the two 
bd40: 66 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f  free slots do no
bd50: 74 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  t .      ** over
bd60: 6c 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e  lap, this guaran
bd70: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65  tees that the me
bd80: 6d 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65  mmove() calls be
bd90: 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
bda0: 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20     ** overwrite 
bdb0: 74 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62  the usableSize b
bdc0: 79 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e  yte buffer, even
bdd0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
bde0: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
bdf0: 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  s corrupt.  */. 
be00: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
be10: 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32  ee2==0 || iFree2
be20: 3e 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  >iFree );.      
be30: 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65  assert( iFree+ge
be40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
be50: 65 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65  ee+2]) <= usable
be60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
be70: 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20  sert( iFree2==0 
be80: 7c 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79  || iFree2+get2by
be90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bea0: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
beb0: 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
bec0: 30 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61  0==iFree2 || (da
bed0: 74 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26  ta[iFree2]==0 &&
bee0: 20 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d   data[iFree2+1]=
bef0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  =0) ){.        u
bf00: 38 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b  8 *pEnd = &data[
bf10: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
bf20: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75  ll*2];.        u
bf30: 38 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20  8 *pAddr;.      
bf40: 20 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20    int sz2 = 0;. 
bf50: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
bf60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
bf70: 46 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20  Free+2]);.      
bf80: 20 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32    int top = get2
bf90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
bfa0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
bfb0: 74 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20  top>=iFree ){.  
bfc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bfd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
bfe0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
bff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
c000: 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20   iFree2 ){.     
c010: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c020: 65 65 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b  ee+sz<=iFree2 );
c030: 20 2f 2a 20 56 65 72 69 66 69 65 64 20 62 79 20   /* Verified by 
c040: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a  pageFindSlot() *
c050: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32 20  /.          sz2 
c060: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c070: 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20  [iFree2+2]);.   
c080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c090: 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65  Free+sz+sz2+iFre
c0a0: 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d  e2-(iFree+sz) <=
c0b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
c0c0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
c0d0: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
c0e0: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
c0f0: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
c100: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
c110: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
c120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c130: 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b    cbrk = top+sz;
c140: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c150: 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70   cbrk+(iFree-top
c160: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
c170: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
c180: 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ve(&data[cbrk], 
c190: 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65  &data[top], iFre
c1a0: 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  e-top);.        
c1b0: 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b  for(pAddr=&data[
c1c0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64  cellOffset]; pAd
c1d0: 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d  dr<pEnd; pAddr+=
c1e0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63  2){.          pc
c1f0: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
c200: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
c210: 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75  ( pc<iFree ){ pu
c220: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
c230: 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  +sz); }.        
c240: 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46    else if( pc<iF
c250: 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74 65  ree2 ){ put2byte
c260: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b  (pAddr, pc+sz2);
c270: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c280: 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67       goto defrag
c290: 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ment_out;.      
c2a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  }.    }.  }..  c
c2b0: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
c2c0: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
c2d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
c2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
c2f0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
c300: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
c310: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
c320: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
c330: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
c340: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
c350: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c360: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
c370: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
c380: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
c390: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
c3a0: 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ast );.    /* Th
c3b0: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
c3c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
c3d0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
c3e0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
c3f0: 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65   ** if PRAGMA ce
c400: 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
c410: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c420: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
c430: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
c440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c460: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
c470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
c480: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
c490: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
c4a0: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
c4b0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
c4c0: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
c4d0: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
c4e0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
c4f0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
c500: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
c510: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c520: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c530: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
c540: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c550: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
c560: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
c570: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
c580: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
c590: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c5a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c5b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
c5c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
c5d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
c5e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
c5f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
c600: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
c610: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
c620: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
c630: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
c640: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
c650: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
c660: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c670: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
c680: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
c690: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
c6a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
c6b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
c6c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
c6d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
c6e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
c6f0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c700: 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74   0;.. defragment
c710: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61  _out:.  if( data
c720: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
c730: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
c740: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
c750: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c760: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c770: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
c780: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
c790: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c7a0: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
c7b0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
c7c0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
c7d0: 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  2] = 0;.  memset
c7e0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
c7f0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
c800: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
c810: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c820: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c830: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
c860: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
c870: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
c880: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
c890: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
c8a0: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
c8b0: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
c8c0: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
c8d0: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
c8e0: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
c8f0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
c900: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
c910: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
c920: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
c930: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
c940: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
c950: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c960: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
c970: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
c980: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
c990: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
c9a0: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
c9b0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
c9c0: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
c9d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
c9e0: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
c9f0: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
ca00: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
ca10: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
ca20: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
ca30: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
ca40: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
ca50: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
ca60: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
ca70: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
ca80: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ca90: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
caa0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
cab0: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
cac0: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
cad0: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
cae0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
caf0: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
cb00: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
cb10: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
cb20: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
cb30: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
cb40: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cb50: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
cb60: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
cb70: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
cb80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
cb90: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
cba0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cbb0: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
cbc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  /..  assert( pc>
cbd0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  0 );.  while( pc
cbe0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  <=usableSize-4 )
cbf0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
cc00: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
cc10: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
cc20: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
cc30: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
cc40: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
cc50: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
cc60: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
cc70: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
cc80: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
cc90: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
cca0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
ccb0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
ccc0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
ccd0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
cce0: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
ccf0: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
cd00: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
cd10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cd20: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
cd30: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
cd40: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
cd50: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
cd60: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
cd70: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
cd80: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
cd90: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
cda0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
cdb0: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
cdc0: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
cdd0: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
cde0: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
cdf0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
ce00: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
ce10: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
ce20: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
ce30: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
ce40: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
ce50: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
ce60: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
ce70: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
ce80: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
ce90: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
cea0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
ceb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
cec0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
ced0: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
cee0: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
cef0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
cf00: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
cf10: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )x;.      }else{
cf20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cf30: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
cf40: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
cf50: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
cf60: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
cf70: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
cf80: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
cf90: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
cfa0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
cfb0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
cfc0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
cfd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
cfe0: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
cff0: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
d000: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
d010: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
d020: 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64  ;.    if( pc<iAd
d030: 64 72 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b  dr+size ) break;
d040: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b  .  }.  if( pc ){
d050: 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49  .    *pRc = SQLI
d060: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
d070: 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
d080: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d090: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
d0a0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
d0b0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
d0c0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
d0d0: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
d0e0: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
d0f0: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
d100: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
d110: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
d120: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
d130: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
d140: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
d150: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
d160: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
d170: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
d180: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
d190: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
d1a0: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
d1b0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
d1c0: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
d1d0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
d1e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
d1f0: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
d200: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
d210: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
d220: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
d230: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
d240: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d250: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
d260: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
d270: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
d280: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
d290: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
d2a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
d2b0: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
d2c0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
d2d0: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
d2e0: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
d2f0: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
d300: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
d310: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
d320: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
d330: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
d340: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
d350: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
d360: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
d370: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
d380: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d390: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d3a0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
d3b0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
d3c0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
d3d0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
d3e0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
d3f0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
d420: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
d430: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
d440: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
d470: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
d480: 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20   gap;        /* 
d490: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61  First byte of ga
d4a0: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70  p between cell p
d4b0: 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c  ointers and cell
d4c0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20   content */.  . 
d4d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d4e0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
d4f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d510: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
d520: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d530: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d540: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d550: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
d560: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
d570: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
d580: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
d590: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
d5a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d5b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
d5c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
d5d0: 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61  Byte < (int)(pPa
d5e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d5f0: 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73  ize-8) );..  ass
d600: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
d610: 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20  Offset == hdr + 
d620: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
d630: 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50  af );.  gap = pP
d640: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
d650: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
d660: 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c  ;.  assert( gap<
d670: 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45  =65536 );.  /* E
d680: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
d690: 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65  356-02391 If the
d6a0: 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61   database uses a
d6b0: 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65   65536-byte page
d6c0: 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74   size.  ** and t
d6d0: 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63  he reserved spac
d6e0: 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75  e is zero (the u
d6f0: 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72  sual value for r
d700: 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20  eserved space). 
d710: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c   ** then the cel
d720: 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  l content offset
d730: 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67   of an empty pag
d740: 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35  e wants to be 65
d750: 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65  536..  ** Howeve
d760: 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20  r, that integer 
d770: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
d780: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32  be stored in a 2
d790: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20  -byte unsigned. 
d7a0: 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20   ** integer, so 
d7b0: 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20  a value of 0 is 
d7c0: 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63  used in its plac
d7d0: 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  e. */.  top = ge
d7e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d7f0: 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +5]);.  assert( 
d800: 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d  top<=(int)pPage-
d810: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d820: 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62   ); /* Prevent b
d830: 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  y getAndInitPage
d840: 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e  () */.  if( gap>
d850: 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74  top ){.    if( t
d860: 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  op==0 && pPage->
d870: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d  pBt->usableSize=
d880: 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20  =65536 ){.      
d890: 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20  top = 65536;.   
d8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
d8b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d8c0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
d8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d8e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
d8f0: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
d900: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
d910: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
d920: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
d930: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
d940: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
d950: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
d960: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
d970: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
d980: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
d990: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
d9a0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
d9b0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
d9c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d9d0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
d9e0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
d9f0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
da00: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
da10: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
da20: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
da30: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
da40: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
da50: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
da60: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
da70: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
da80: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
da90: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
daa0: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
dab0: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
dac0: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
dad0: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
dae0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
daf0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
db00: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
db10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
db20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
db30: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
db40: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
db50: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
db60: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
db70: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
db80: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
db90: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
dba0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
dbb0: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
dbc0: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
dbd0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
dbe0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
dbf0: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
dc00: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
dc10: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
dc20: 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65  ge, MIN(4, pPage
dc30: 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79  ->nFree - (2+nBy
dc40: 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  te)));.    if( r
dc50: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
dc60: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
dc70: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
dc80: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
dc90: 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c  rt( gap+2+nByte<
dca0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
dcb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
dcc0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
dcd0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
dce0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
dcf0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
dd00: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
dd10: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
dd20: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
dd30: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
dd40: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
dd50: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
dd60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
dd70: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
dd80: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
dd90: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
dda0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
ddb0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
ddc0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
ddd0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
dde0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
ddf0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
de00: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
de10: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
de20: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
de30: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
de40: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
de50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
de60: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
de70: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
de80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
de90: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
dea0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
deb0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
dec0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
ded0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
dee0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
def0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
df00: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
df10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
df20: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
df30: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
df40: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
df50: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
df60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
df70: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
df80: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
df90: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
dfa0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
dfb0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
dfc0: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
dfd0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
dfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
dff0: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
e000: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
e010: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
e020: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
e030: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
e040: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
e050: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
e060: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
e070: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
e080: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
e090: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
e0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e0b0: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
e0c0: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
e0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
e0e0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
e0f0: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
e100: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
e110: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e140: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
e150: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
e160: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e190: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
e1a0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
e1b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
e1e0: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
e1f0: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
e200: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e220: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
e230: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
e240: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
e250: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
e260: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
e270: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
e280: 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20  */.  u16 x;     
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
e2b0: 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
e2c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75  tent area */.  u
e2d0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
e2e0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
e2f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
e300: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
e310: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
e320: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
e330: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
e340: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
e350: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
e360: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
e370: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e380: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
e390: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
e3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e3b0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
e3c0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
e3d0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
e3e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
e400: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
e410: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
e420: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
e430: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e440: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e450: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e460: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
e470: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
e480: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
e490: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
e4a0: 53 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42  Start<=pPage->pB
e4b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
e4c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73  );..  /* The lis
e4d0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
e4e0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
e4f0: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
e500: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
e510: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
e520: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
e530: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
e540: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
e550: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
e560: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
e570: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
e580: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
e590: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
e5a0: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
e5b0: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
e5c0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
e5d0: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
e5e0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
e5f0: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
e600: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
e610: 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74  a[iPtr]))<iStart
e620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
e630: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b  reeBlk<iPtr+4 ){
e640: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
e650: 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b  eeBlk==0 ) break
e660: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e670: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e680: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
e690: 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20     }.      iPtr 
e6a0: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
e6b0: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
e6c0: 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  lk>pPage->pBt->u
e6d0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
e6e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e6f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e700: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e710: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
e720: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
e730: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
e740: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e750: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
e760: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
e770: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
e780: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
e790: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
e7a0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
e7b0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
e7c0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
e7d0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
e7e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
e7f0: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
e800: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
e810: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
e820: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
e830: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
e840: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
e850: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
e860: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
e870: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
e880: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
e890: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e8a0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e8b0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
e8c0: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
e8d0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
e8e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e8f0: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
e900: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
e910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e920: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e930: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e940: 20 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d   }.      iSize =
e950: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
e960: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
e970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e980: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
e990: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
e9a0: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
e9b0: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
e9c0: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
e9d0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
e9e0: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
e9f0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
ea00: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
ea10: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
ea20: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
ea30: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
ea40: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
ea50: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
ea60: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
ea70: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
ea80: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
ea90: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
eaa0: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
eab0: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
eac0: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
ead0: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
eae0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
eaf0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
eb00: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
eb10: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
eb20: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
eb30: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
eb40: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
eb50: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
eb60: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
eb70: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
eb80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
eb90: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
eba0: 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
ebb0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
ebc0: 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28  .  x = get2byte(
ebd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
ebe0: 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29   if( iStart<=x )
ebf0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
ec00: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
ec10: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
ec20: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec30: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
ec40: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
ec50: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ec60: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
ec70: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
ec80: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
ec90: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
eca0: 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74   iStart<x || iPt
ecb0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
ecc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ecd0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ece0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ecf0: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
ed00: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
ed10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
ed20: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
ed30: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
ed40: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
ed50: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
ed60: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
ed70: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
ed80: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tart);.  }.  if(
ed90: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73   pPage->pBt->bts
eda0: 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
edb0: 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f  _SECURE ){.    /
edc0: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
edd0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
ede0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
edf0: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
ee00: 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  e.    ** option 
ee10: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
ee20: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
ee30: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
ee40: 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
ee50: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
ee60: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75   iFreeBlk);.  pu
ee70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
ee80: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
ee90: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
eea0: 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
eeb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
eed0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
eee0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
eef0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
ef00: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
ef10: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
ef20: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
ef30: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
ef40: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
ef50: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
ef60: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
ef70: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
ef80: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
ef90: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
efa0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
efb0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
efc0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
efd0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
efe0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
eff0: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
f000: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f010: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
f020: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
f030: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f040: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
f050: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
f060: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
f070: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
f080: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
f090: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
f0a0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
f0b0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
f0c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f0d0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
f0e0: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
f0f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f100: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f110: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f120: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
f130: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
f140: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
f150: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
f160: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
f170: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
f180: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f190: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
f1a0: 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43  eaf;.  pPage->xC
f1b0: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
f1c0: 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70  zePtr;.  pBt = p
f1d0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
f1e0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
f1f0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
f200: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a  NTKEY) ){.    /*
f210: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f220: 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61  07291-35328 A va
f230: 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20  lue of 5 (0x05) 
f240: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f250: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
f260: 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65  rior table b-tre
f270: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f280: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
f290: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
f2a0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
f2b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39  IDENCE-OF: R-269
f2c0: 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65  00-09176 A value
f2d0: 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65   of 13 (0x0d) me
f2e0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f2f0: 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61  a.    ** leaf ta
f300: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
f310: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f320: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
f330: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
f340: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
f350: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
f360: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
f370: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
f380: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f390: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
f3a0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f3b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f3c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f3d0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f3e0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
f3f0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f400: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f   = cellSizePtrNo
f410: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70  Payload;.      p
f420: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
f430: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
f440: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  lPtrNoPayload;. 
f450: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
f460: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
f470: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
f480: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
f490: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
f4a0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
f4b0: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
f4c0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
f4d0: 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33  CE-OF: R-43316-3
f4e0: 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20  7308 A value of 
f4f0: 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74  2 (0x02) means t
f500: 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
f510: 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e    ** interior in
f520: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
f530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f540: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
f550: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
f560: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35  ENCE-OF: R-59615
f570: 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f  -42828 A value o
f580: 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e  f 10 (0x0a) mean
f590: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f5a0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65      ** leaf inde
f5b0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f5c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f5d0: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
f5e0: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
f5f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f600: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
f610: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f620: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f630: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f640: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
f650: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
f660: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
f670: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
f680: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f690: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
f6a0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f6b0: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
f6c0: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
f6d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
f6e0: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
f6f0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
f700: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f720: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
f730: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
f740: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
f750: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
f760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f770: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
f780: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
f790: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
f7a0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
f7b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
f7c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f7d0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
f7e0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f7f0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
f800: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
f810: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
f820: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
f830: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
f840: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
f850: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
f860: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
f870: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
f880: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
f890: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
f8a0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
f8b0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
f8c0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
f8d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
f8e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
f8f0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
f900: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
f910: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f920: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
f930: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
f940: 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  [] */.  u8 hdr; 
f950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
f960: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
f970: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
f980: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
f990: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
f9a0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
f9b0: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
f9c0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
f9d0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
f9e0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
f9f0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
fa00: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
fa10: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
fa20: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36  ch page */.  u16
fa30: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
fa40: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
fa50: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
fa60: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
fa70: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
fa80: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
fa90: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
faa0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
fab0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fad0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
fae0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
faf0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
fb00: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
fb10: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
fb20: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb30: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  set */.  int iCe
fb40: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
fb50: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
fb60: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
fb70: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ffset */..  asse
fb80: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
fb90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
fbb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fbc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fbd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
fbe0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
fbf0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
fc00: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
fc10: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
fc20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
fc30: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
fc40: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
fc50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fc60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fc70: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
fc80: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
fc90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
fcb0: 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  age->isInit==0 )
fcc0: 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ;..  pBt = pPage
fcd0: 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70  ->pBt;.  hdr = p
fce0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
fcf0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
fd00: 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49  >aData;.  /* EVI
fd10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
fd20: 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
fd30: 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
fd40: 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
fd50: 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
fd60: 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
fd70: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
fd80: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
fd90: 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
fda0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fdb0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
fdc0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
fdd0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
fde0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
fdf0: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
fe00: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
fe10: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
fe20: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
fe30: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
fe40: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
fe50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
fe60: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
fe70: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
fe80: 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
fe90: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
fea0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
feb0: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
fec0: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
fed0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
fee0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
fef0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ff00: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ff10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ff20: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ff30: 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
ff40: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
ff50: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
ff60: 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a   designates.  **
ff70: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ff80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ff90: 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
ffa0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
ffb0: 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72  er is.  ** inter
ffc0: 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
ffd0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
ffe0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
fff0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20  a[hdr+5]);.  /* 
10000 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
10010 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
10020 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10030 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
10040 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
10050 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
10060 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61  e page. */.  pPa
10070 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
10080 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
10090 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ]);.  if( pPage-
100a0 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
100b0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f  Bt) ){.    /* To
100c0 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
100d0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
100e0 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
100f0 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10110 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10120 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
10130 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
10140 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
10150 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
10160 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
10170 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
10180 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
10190 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a  ich is only.  **
101a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
101b0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
101c0 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
101d0 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
101e0 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74   the.  ** offset
101f0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
10200 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
10210 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
10220 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a  ze minus the.  *
10230 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72  * bytes of reser
10240 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ved space. */.  
10250 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
10260 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
10270 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
10280 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a  RUPT_DB );..  /*
10290 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
102a0 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
102b0 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
102c0 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
102d0 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
102e0 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
102f0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65    .  **.  ** The
10300 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
10310 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
10320 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
10330 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
10340 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
10350 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
10360 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
10370 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
10380 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e   be .  ** return
10390 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
103a0 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   */.  iCellFirst
103b0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
103c0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
103d0 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
103e0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
103f0 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  if( pBt->db->fla
10400 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c  gs & SQLITE_Cell
10410 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e  SizeCk ){.    in
10420 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10430 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
10440 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
10450 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
10460 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
10470 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
10480 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  */..    if( !pPa
10490 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
104a0 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28  Last--;.    for(
104b0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
104c0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
104d0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
104e0 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
104f0 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
10500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10510 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
10520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10530 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
10540 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
10550 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
10560 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
10570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10580 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10590 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
105a0 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
105b0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
105c0 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
105d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
105e0 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
105f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b  );.      if( pc+
10600 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
10610 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10630 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10650 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
10660 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
10670 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }  ..  /* Comput
10680 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
10690 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
106a0 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  ge.  ** EVIDENCE
106b0 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
106c0 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
106d0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
106e0 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
106f0 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
10700 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
10710 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
10720 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
10730 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65   are no.  ** fre
10740 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63  eblocks. */.  pc
10750 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10760 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
10770 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
10780 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
10790 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
107a0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
107b0 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30  ce */.  if( pc>0
107c0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74   ){.    u32 next
107d0 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
107e0 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  pc<iCellFirst ){
107f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
10800 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
10810 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
10820 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
10830 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
10840 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
10850 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
10860 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
10870 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
10880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
108a0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
108b0 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c   .    }.    whil
108c0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
108d0 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  ( pc>iCellLast )
108e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
108f0 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65  eblock off the e
10900 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
10910 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
10920 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10930 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10940 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
10950 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10960 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
10970 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
10980 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
10990 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
109a0 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
109b0 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
109c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
109d0 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
109e0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20  .    if( next>0 
109f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
10a00 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63  block not in asc
10a10 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
10a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10a40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
10a50 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28     if( pc+size>(
10a60 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61  unsigned int)usa
10a70 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10a80 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f   /* Last freeblo
10a90 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ck extends past 
10aa0 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  page end */.    
10ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ac0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10ad0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
10ae0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
10af0 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
10b00 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
10b10 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10b20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
10b30 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b40 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
10b50 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
10b60 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  s within.  ** th
10b70 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b80 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
10b90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10ba0 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a   usable-size.  *
10bb0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
10bc0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
10bd0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
10be0 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
10bf0 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
10c00 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
10c10 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
10c20 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
10c30 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61  ontent.  ** area
10c40 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
10c50 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
10c60 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
10c70 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
10c80 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
10c90 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10ca0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10cb0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
10cc0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10cd0 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
10ce0 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50  CellFirst);.  pP
10cf0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
10d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10d10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
10d20 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
10d30 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
10d40 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
10d50 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
10d60 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
10d70 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
10d80 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
10d90 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
10da0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10db0 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
10dc0 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
10dd0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
10de0 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
10df0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10e00 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
10e10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10e20 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
10e30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10e40 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
10e50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e60 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
10e70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10e80 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
10e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10ea0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10eb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10ec0 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
10ed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
10ee0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
10ef0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
10f00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10f10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10f20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10f30 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
10f40 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
10f50 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  RE ){.    memset
10f60 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
10f70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10f80 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
10f90 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
10fa0 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
10fb0 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
10fc0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
10fd0 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
10fe0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
10ff0 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
11000 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
11010 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
11020 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11030 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
11040 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
11050 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
11060 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
11070 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
11080 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
11090 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
110a0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
110b0 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
110c0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
110d0 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
110e0 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
110f0 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
11100 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
11110 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
11120 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11130 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
11140 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
11150 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
11160 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
11170 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
11180 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
11190 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
111a0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
111b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
111c0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
111d0 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
111e0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
111f0 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
11200 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
11210 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
11220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
11230 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
11240 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
11250 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
11260 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
11270 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
11280 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11290 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
112a0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
112b0 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
112c0 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
112d0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
112e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
112f0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
11300 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
11310 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
11320 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
11330 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
11340 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
11350 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
11360 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
11370 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
11390 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
113a0 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
113b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
113c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
113d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
113e0 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
113f0 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
11400 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
11410 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
11420 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
11430 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
11440 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
11450 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
11460 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
11470 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
11480 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
11490 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
114a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
114b0 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
114c0 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
114d0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
114e0 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
114f0 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
11500 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
11510 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
11520 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
11530 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
11540 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11550 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
11560 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
11570 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
11580 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
11590 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
115a0 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
115b0 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
115c0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
115d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
115e0 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
115f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11600 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11610 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
11620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11630 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11640 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
11650 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11660 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11670 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11680 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11690 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
116a0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
116b0 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
116c0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
116d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
116e0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
116f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
11700 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
11710 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11720 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
11730 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
11740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11760 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11780 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
11790 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
117a0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
117b0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
117c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
117d0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
117e0 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
117f0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
11800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11810 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
11820 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
11830 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
11840 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
11850 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
11860 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
11870 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
11880 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
11890 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
118a0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
118b0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
118c0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
118d0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
118e0 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
118f0 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
11900 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
11910 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
11920 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11930 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11940 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
11950 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
11960 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
11970 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
11980 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
11990 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
119a0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
119b0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
119c0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
119d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
119e0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
119f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11a00 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
11a10 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
11a20 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
11a30 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
11a40 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
11a50 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
11a60 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
11a70 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
11a80 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
11a90 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
11aa0 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
11ab0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
11ac0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
11ad0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
11ae0 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
11af0 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30 29  age)&0x80000000)
11b00 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11b10 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11b20 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
11b30 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11b40 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
11b50 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a  nitialize it..**
11b60 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74  .** If pCur!=0 t
11b70 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
11b80 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73  being fetched as
11b90 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54   part of a moveT
11ba0 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c  oChild().** call
11bb0 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  .  Do additional
11bc0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
11bd0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20   on the page in 
11be0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e  this case..** An
11bf0 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66  d if the fetch f
11c00 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ails, this routi
11c10 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e  ne must decremen
11c20 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a  t pCur->iPage..*
11c30 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73  *.** The page is
11c40 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64   fetched as read
11c50 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43  -write unless pC
11c60 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  ur is not NULL a
11c70 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d  nd is.** a read-
11c80 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  only cursor..**.
11c90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
11ca0 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50  ccurs, then *ppP
11cb0 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  age is undefined
11cc0 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
11cd0 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
11ce0 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
11cf0 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
11d00 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
11d10 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
11d20 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11d30 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
11d40 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11d50 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
11d60 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d80 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
11d90 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
11da0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
11db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
11dd0 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
11de0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
11df0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
11e00 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
11e10 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67   receive the pag
11e20 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
11e30 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20  int bReadOnly   
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
11e60 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a  ad-only page */.
11e70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
11e80 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
11e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11ea0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11eb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
11ec0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
11ed0 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e   ppPage==&pCur->
11ee0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
11ef0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
11f00 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
11f10 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
11f20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11f30 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
11f40 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
11f50 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
11f60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
11f70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
11f80 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
11f90 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11fa0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
11fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11fc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
11fd0 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
11fe0 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
11ff0 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
12000 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12010 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12020 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
12030 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
12040 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
12050 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
12060 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
12070 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
12080 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12090 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
120a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
120b0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
120c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
120d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
120e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
120f0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
12100 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12110 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
12120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
12130 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
12140 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
12150 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
12160 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
12170 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
12180 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
12190 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
121a0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
121b0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
121c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
121d0 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
121e0 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
121f0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
12200 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
12210 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
12220 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
12230 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
12240 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12250 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
12260 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65  (pgno);.    rele
12270 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
12280 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12290 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
122a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
122b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64  LITE_OK;..getAnd
122c0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a  InitPage_error:.
122d0 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
122e0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
122f0 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
12300 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
12310 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
12320 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  }.  testcase( pg
12330 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
12340 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
12350 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
12360 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
12370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
12380 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
12390 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
123a0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
123b0 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
123c0 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
123d0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20  .**.** Page1 is 
123e0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 61  a special case a
123f0 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61  nd must be relea
12400 73 65 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73  sed using releas
12410 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73  ePageOne()..*/.s
12420 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
12430 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
12440 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12470 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
12480 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12490 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
124a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124b0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
124c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
124d0 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
124e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
124f0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
12500 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
12510 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
12520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12540 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12550 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
12560 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
12570 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
12580 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
12590 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
125a0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
125b0 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
125c0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
125d0 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  e);.}.static voi
125e0 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
125f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12600 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
12610 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
12620 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
12630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12640 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
12650 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
12660 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
12670 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12680 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
12690 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
126a0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
126b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
126c0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
126d0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
126e0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
126f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12700 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
12710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
12720 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
12730 50 61 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70  PageOne(pPage->p
12740 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
12750 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20  * Get an unused 
12760 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  page..**.** This
12770 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
12780 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
12790 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
127a0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66  n:.**.**   *  If
127b0 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
127c0 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20  eady in use for 
127d0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
127e0 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  se, immediately.
127f0 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  **      release 
12800 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  it and return an
12810 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20   SQLITE_CURRUPT 
12820 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d  error..**   *  M
12830 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49  ake sure the isI
12840 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nit flag is clea
12850 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
12860 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
12870 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
12880 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
12890 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
128a0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
128b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
128c0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
128d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
128e0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
128f0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
12900 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
12910 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
12920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
12930 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
12940 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
12950 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
12960 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
12970 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
12980 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
12990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
129a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
129b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
129c0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
129d0 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
129e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
129f0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
12a00 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12a20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
12a40 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
12a50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
12a60 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
12a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12a80 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
12a90 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
12aa0 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
12ab0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
12ac0 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
12ad0 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
12ae0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
12af0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
12b00 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
12b10 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
12b20 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
12b30 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
12b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12b50 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
12b60 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
12b70 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
12b80 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
12b90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
12ba0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
12bb0 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
12bc0 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
12bd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
12be0 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
12bf0 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
12c00 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
12c10 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
12c20 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
12c30 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
12c40 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
12c50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12c60 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
12c70 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
12c80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12c90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12ca0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12cb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
12cc0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
12cd0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
12ce0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12cf0 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
12d00 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
12d10 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
12d20 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
12d30 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
12d40 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
12d50 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
12d60 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
12d70 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
12d80 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
12d90 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
12da0 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
12db0 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
12dc0 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
12dd0 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
12de0 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
12df0 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
12e00 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
12e10 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
12e20 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
12e30 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
12e40 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
12e50 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
12e60 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
12e70 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
12e80 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
12e90 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
12ea0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
12eb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12ec0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
12ed0 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
12ee0 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
12ef0 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
12f00 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
12f10 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
12f20 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
12f30 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
12f40 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
12f50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12f60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12f70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
12f80 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
12f90 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
12fa0 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
12fb0 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20  syHandler,.     
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12fe0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
12ff0 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a  t->pPager));.}..
13000 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
13010 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
13020 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
13030 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
13040 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13050 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
13060 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
13070 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
13080 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
13090 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
130a0 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
130b0 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
130c0 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
130d0 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
130e0 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
130f0 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
13100 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
13110 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
13120 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
13130 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
13140 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
13150 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
13160 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
13170 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
13180 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
13190 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
131a0 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
131b0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
131c0 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
131d0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
131e0 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
131f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
13200 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
13210 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
13220 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
13230 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
13240 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
13250 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
13260 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
13270 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
13280 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
13290 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
132a0 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
132b0 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
132c0 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
132d0 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
132e0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
132f0 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
13300 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
13310 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
13320 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
13330 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
13340 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
13350 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
13360 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
13370 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
13380 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13390 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
133a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
133b0 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
133c0 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
133d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
133e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
133f0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
13400 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
13410 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
13420 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
13430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
13440 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
13450 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
13460 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
13470 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
13480 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
13490 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
134a0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
134b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
134c0 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
134d0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
134e0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
134f0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
13500 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
13510 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
13520 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13540 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
13550 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
13560 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
13590 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
135a0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
135b0 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
135c0 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
135d0 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
135e0 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
135f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13610 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
13620 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
13630 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
13660 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
13670 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
13680 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
13690 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
136a0 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
136b0 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
136c0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
136d0 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
136e0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
136f0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
13700 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
13710 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
13720 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
13730 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
13740 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
13750 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
13760 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
13770 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
13780 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
13790 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
137a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
137b0 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
137c0 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
137d0 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
137e0 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
137f0 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
13800 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
13810 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
13840 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
13850 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
13880 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
13890 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
138a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
138b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
138c0 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
138d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
138e0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
138f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
13900 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
13910 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
13920 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
13930 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
13940 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
13950 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
13960 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
13970 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
13980 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
13990 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
139a0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
139b0 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
139c0 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
139d0 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
139e0 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
139f0 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
13a00 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
13a10 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
13a20 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
13a30 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
13a40 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
13a50 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
13a60 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
13a70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
13a80 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
13a90 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
13aa0 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
13ab0 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
13ac0 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
13ad0 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
13ae0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
13af0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
13b00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
13b10 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
13b20 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
13b30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
13b40 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  KPT;.  }.  p->in
13b50 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
13b60 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
13b70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13b80 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13b90 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  HE.  p->lock.pBt
13ba0 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f  ree = p;.  p->lo
13bb0 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23  ck.iTable = 1;.#
13bc0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
13bd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13be0 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13bf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13c00 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13c10 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
13c20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
13c30 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
13c40 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
13c50 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
13c60 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
13c70 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
13c80 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
13c90 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d    if( isTempDb==
13ca0 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30  0 && (isMemdb==0
13cb0 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51   || (vfsFlags&SQ
13cc0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d  LITE_OPEN_URI)!=
13cd0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66  0) ){.    if( vf
13ce0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
13cf0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
13d00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
13d10 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
13d20 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
13d30 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e  ame)+1;.      in
13d40 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
13d50 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
13d60 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
13d70 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
13d80 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
13d90 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  MAX(nFullPathnam
13da0 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  e,nFilename));. 
13db0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
13dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
13dd0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
13de0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
13df0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  le = 1;.      if
13e00 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
13e10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13e20 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13e30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13e40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
13e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13e60 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
13e70 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
13e80 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
13e90 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
13ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13eb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13ec0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
13ed0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
13ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61       nFullPathna
13f10 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
13f20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
13f30 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
13f40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
13f50 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
13f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13f70 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
13f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
13fa0 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
13fb0 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78  SAFE.      mutex
13fc0 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
13fd0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
13fe0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
13ff0 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
14000 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
14010 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
14020 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
14030 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14040 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14050 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
14060 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14070 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
14080 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
14090 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
140a0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
140b0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
140c0 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
140d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
140e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
140f0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
14100 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
14110 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
14120 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
14130 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  me(pBt->pPager, 
14140 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
14150 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
14160 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
14170 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
14180 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
14190 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
141a0 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
141b0 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
141c0 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
141d0 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
141e0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
141f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14200 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
14210 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
14220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14240 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
14250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14260 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14270 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
14280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14290 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
142a0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
142b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
142c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
142d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
142e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
142f0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
14300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14310 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
14320 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
14330 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
14340 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14360 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14370 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
14380 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
14390 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
143a0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
143b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
143c0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
143d0 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
143e0 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
143f0 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
14400 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
14410 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
14420 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
14430 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
14440 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
14450 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
14460 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
14470 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
14480 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
14490 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
144a0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
144b0 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
144c0 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
144d0 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
144e0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
144f0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
14500 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
14510 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
14520 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
14530 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
14540 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
14550 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
14560 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
14570 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
14580 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
14590 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
145a0 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
145b0 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
145c0 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
145d0 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
145e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
145f0 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
14600 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
14610 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
14620 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
14630 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
14640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14650 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
14660 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14670 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
14680 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
14690 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
146a0 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
146b0 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
146c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
146d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
146e0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
146f0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
14700 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14710 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
14720 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
14730 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61      sizeof(MemPa
14760 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  ge), flags, vfsF
14770 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74  lags, pageReinit
14780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
147a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
147b0 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
147c0 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d  pPager, db->szMm
147d0 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ap);.      rc = 
147e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
147f0 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e  Fileheader(pBt->
14800 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44  pPager,sizeof(zD
14810 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64  bHeader),zDbHead
14820 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
14830 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14840 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
14850 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
14860 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70     }.    pBt->op
14870 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c  enFlags = (u8)fl
14880 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62  ags;.    pBt->db
14890 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74   = db;.    sqlit
148a0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 48 61  e3PagerSetBusyHa
148b0 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
148c0 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  r, btreeInvokeBu
148d0 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b  syHandler, pBt);
148e0 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42  .    p->pBt = pB
148f0 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70  t;.  .    pBt->p
14900 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
14910 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
14920 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14930 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
14940 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70  pBt->pPager) ) p
14950 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14960 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23  BTS_READ_ONLY;.#
14970 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14980 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  E_SECURE_DELETE)
14990 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
149a0 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
149b0 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64  _DELETE;.#elif d
149c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41  efined(SQLITE_FA
149d0 53 54 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  ST_SECURE_DELETE
149e0 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ).    pBt->btsFl
149f0 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57  ags |= BTS_OVERW
14a00 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  RITE;.#endif.   
14a10 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
14a20 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
14a30 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
14a40 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
14a50 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
14a60 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
14a70 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
14a80 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
14a90 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
14aa0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
14ab0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
14ac0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
14ad0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
14ae0 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
14af0 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
14b00 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
14b10 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
14b20 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
14b30 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
14b40 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
14b50 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
14b60 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
14b70 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
14b80 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
14b90 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
14ba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14bb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
14bc0 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
14bd0 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
14be0 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
14bf0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
14c00 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
14c10 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
14c20 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
14c30 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
14c40 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
14c50 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
14c60 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14c70 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
14c80 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
14c90 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
14ca0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
14cb0 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
14cc0 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
14cd0 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
14ce0 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
14cf0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
14d00 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
14d10 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
14d20 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
14d30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
14d40 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
14d50 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
14d60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14d70 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
14d80 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
14d90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
14da0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
14db0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14dc0 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
14dd0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
14de0 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
14df0 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
14e00 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
14e10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
14e20 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
14e30 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
14e40 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
14e50 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
14e60 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
14e70 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14e80 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
14e90 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
14ea0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
14eb0 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
14ec0 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
14ed0 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
14ee0 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
14ef0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14f00 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14f20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14f30 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
14f40 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14f50 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14f60 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
14f70 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14f80 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14f90 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
14fa0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
14fb0 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
14fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14fd0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
14fe0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
14ff0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
15000 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
15010 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
15020 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
15030 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
15040 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
15050 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
15060 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
15070 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
15080 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
15090 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
150a0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
150b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
150c0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
150d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
150e0 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
150f0 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
15100 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
15110 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
15120 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
15130 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74  ..    */.    pBt
15140 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
15150 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
15160 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
15170 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
15180 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
15190 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ; ).      MUTEX_
151a0 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72  LOGIC( mutexShar
151b0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
151c0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
151d0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
151e0 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53  R);).      if( S
151f0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15200 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
15210 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
15220 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
15230 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
15240 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
15250 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
15260 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
15270 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
15280 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15290 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
152a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
152b0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
152c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
152d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
152e0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
152f0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
15300 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
15310 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15320 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15330 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
15340 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15350 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15360 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
15370 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15380 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
15390 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
153a0 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
153b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
153c0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
153d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
153e0 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
153f0 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
15400 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
15410 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
15420 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
15430 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
15440 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
15450 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
15460 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
15470 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
15480 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
15490 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
154a0 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
154b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
154c0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
154d0 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
154e0 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
154f0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
15500 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15510 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
15520 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
15530 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
15540 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15550 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
15560 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
15570 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
15580 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70  (uptr)p->pBt<(up
15590 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  tr)pSib->pBt ){.
155a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
155b0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
155c0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
155d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
155e0 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
155f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15600 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
15610 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70  ib->pNext && (up
15620 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  tr)pSib->pNext->
15630 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74  pBt<(uptr)p->pBt
15640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15650 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
15660 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
15670 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
15680 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
15690 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
156a0 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
156b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
156c0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
156d0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
156e0 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
156f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
15700 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
15710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15720 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15730 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15740 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
15750 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
15760 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
15770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15780 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
15790 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
157a0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
157b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a  Bt->pPager, 0);.
157c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
157d0 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
157e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
157f0 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
15800 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
15810 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
15820 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  File;..    /* If
15830 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
15840 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
15850 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
15860 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
15870 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
15880 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
15890 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
158a0 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
158b0 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
158c0 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
158d0 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
158e0 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
158f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
15900 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
15910 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
15920 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
15930 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
15940 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
15950 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
15960 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
15970 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c  .    pFile = sql
15980 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
15990 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
159a0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
159b0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ods ){.      sql
159c0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
159d0 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
159e0 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28  ITE_FCNTL_PDB, (
159f0 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b  void*)&pBt->db);
15a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
15a10 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
15a20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15a30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
15a40 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
15a50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a60 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
15a70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
15a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
15a90 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63  lite3BtreeConnec
15aa0 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72  tionCount(*ppBtr
15ab0 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72  ee)>0 );.  retur
15ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
15ad0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
15ae0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
15af0 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
15b00 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
15b10 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
15b20 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
15b30 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
15b40 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
15b50 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
15b60 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
15b70 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
15b80 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
15b90 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
15ba0 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
15bb0 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
15bc0 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
15bd0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
15be0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15bf0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
15c00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
15c10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
15c20 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72  ster; ).  BtShar
15c30 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
15c40 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
15c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15c60 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
15c70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15c80 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
15c90 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
15ca0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
15cb0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
15cc0 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
15cd0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
15ce0 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
15cf0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
15d00 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
15d10 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
15d20 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
15d30 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
15d40 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
15d50 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15d60 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15d70 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
15d80 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
15d90 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
15da0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15db0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15dc0 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
15dd0 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
15de0 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
15df0 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
15e00 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
15e10 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
15e20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
15e30 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
15e40 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
15e50 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
15e60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15e70 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
15e80 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
15e90 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
15ea0 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
15eb0 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
15ec0 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
15ed0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
15ee0 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
15ef0 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
15f00 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
15f10 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
15f20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
15f30 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
15f40 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
15f50 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
15f60 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20  pBt) bytes with 
15f70 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20  a 4-byte prefix 
15f80 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64  for a left-child
15f90 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  .** pointer..*/.
15fa0 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
15fb0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
15fc0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
15fd0 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
15fe0 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
15ff0 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
16000 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
16010 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
16020 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  .    /* One of t
16030 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e  he uses of pBt->
16040 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20  pTmpSpace is to 
16050 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66  format cells bef
16060 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ore.    ** inser
16070 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61  ting them into a
16080 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63   leaf page (func
16090 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  tion fillInCell(
160a0 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20  )). If.    ** a 
160b0 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61  cell is less tha
160c0 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 4 bytes in siz
160d0 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64  e, it is rounded
160e0 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20   up to 4 bytes. 
160f0 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72     ** by the var
16100 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68  ious routines th
16110 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69  at manipulate bi
16120 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63  nary cells. Whic
16130 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61  h.    ** can mea
16140 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c  n that fillInCel
16150 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c  l() only initial
16160 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32  izes the first 2
16170 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74   or 3.    ** byt
16180 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c  es of pTmpSpace,
16190 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69   but that the fi
161a0 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20  rst 4 bytes are 
161b0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20  copied from.    
161c0 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74  ** it into a dat
161d0 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73  abase page. This
161e0 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
161f0 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20   a problem, but 
16200 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63  it.    ** does c
16210 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20  ause a valgrind 
16220 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31  error when the 1
16230 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75   or 2 bytes of u
16240 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
16250 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65  ** data is passe
16260 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c  d to system call
16270 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20   write(). So to 
16280 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72  avoid this error
16290 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68  ,.    ** zero th
162a0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
162b0 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65  of temp space he
162c0 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  re..    **.    *
162d0 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65  * Also:  Provide
162e0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
162f0 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
16300 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
16310 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  ** beginning of 
16320 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20  pTmpSpace as an 
16330 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74  area available t
16340 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20  o prepend the.  
16350 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20    ** left-child 
16360 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
16370 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65  eginning of a ce
16380 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
16390 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
163a0 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  e ){.      memse
163b0 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  t(pBt->pTmpSpace
163c0 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70  , 0, 8);.      p
163d0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d  Bt->pTmpSpace +=
163e0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   4;.    }.  }.}.
163f0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
16400 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
16410 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
16420 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
16430 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
16440 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
16450 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
16460 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
16470 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69  e -= 4;.    sqli
16480 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d  te3PageFree(pBt-
16490 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
164a0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
164b0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
164c0 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
164d0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
164e0 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
164f0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
16500 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
16510 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
16520 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16530 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
16540 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
16550 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
16560 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
16570 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
16580 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16590 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
165a0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
165b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
165c0 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
165d0 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
165e0 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
165f0 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
16600 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
16610 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
16620 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
16630 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
16640 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
16650 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
16660 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
16670 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
16680 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
16690 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
166a0 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
166b0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
166c0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
166d0 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
166e0 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
166f0 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
16700 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
16710 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
16720 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
16730 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16740 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
16750 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
16760 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
16770 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
16780 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
16790 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
167a0 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
167b0 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
167c0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
167d0 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
167e0 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
167f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
16800 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
16810 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
16820 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
16830 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
16840 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
16850 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
16860 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
16870 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
16880 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
16890 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
168a0 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
168b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
168c0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
168d0 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
168e0 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
168f0 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
16900 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
16910 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
16920 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
16930 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
16940 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69  r, p->db);.    i
16950 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
16960 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
16970 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
16980 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
16990 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
169a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
169b0 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63  Free(0, pBt->pSc
169c0 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
169d0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
169e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
169f0 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
16a00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16a10 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
16a20 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
16a30 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
16a40 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
16a50 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
16a60 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
16a70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16a80 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
16a90 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
16aa0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
16ab0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
16ac0 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
16ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16ae0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16af0 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e   "soft" limit on
16b00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16b10 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
16b20 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64  e..** Unused and
16b30 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65   unmodified page
16b40 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c  s will be recycl
16b50 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed when the numb
16b60 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69  er of.** pages i
16b70 6e 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65  n the cache exce
16b80 65 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69  eds this soft li
16b90 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69  mit.  But the si
16ba0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63  ze of the.** cac
16bb0 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  he is allowed to
16bc0 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61   grow larger tha
16bd0 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20  n this limit if 
16be0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64  it contains.** d
16bf0 69 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61  irty pages or pa
16c00 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74  ges still in act
16c10 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  ive use..*/.int 
16c20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
16c30 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
16c40 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
16c50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16c60 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16c70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16c80 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16c90 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16ca0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16cb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16cc0 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
16cd0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
16ce0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16cf0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16d10 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16d20 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f   "spill" limit o
16d30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16d40 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
16d50 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  he..** If the nu
16d60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78  mber of pages ex
16d70 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74  ceeds this limit
16d80 20 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20   during a write 
16d90 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
16da0 74 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20  the pager might 
16db0 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c  attempt to "spil
16dc0 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  l" pages to the 
16dd0 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e  journal early in
16de0 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65  .** order to fre
16df0 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  e up memory..**.
16e00 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
16e10 75 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72  urned is the cur
16e20 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e  rent spill size.
16e30 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73    If zero is pas
16e40 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67  sed.** as an arg
16e50 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65  ument, no change
16e60 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
16e70 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74  e spill size set
16e80 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e  ting, so.** usin
16e90 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73  g mxPage of 0 is
16ea0 20 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20   a way to query 
16eb0 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
16ec0 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l size..*/.int s
16ed0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70  qlite3BtreeSetSp
16ee0 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70  illSize(Btree *p
16ef0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
16f00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16f10 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
16f20 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  es;.  assert( sq
16f30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16f40 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16f50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16f60 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20  Enter(p);.  res 
16f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
16f80 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e  tSpillsize(pBt->
16f90 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
16fa0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16fb0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16fc0 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51  n res;.}..#if SQ
16fd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
16fe0 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ZE>0./*.** Chang
16ff0 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
17000 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
17010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
17020 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65  hat may be.** me
17030 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a  mory mapped..*/.
17040 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17050 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72  SetMmapLimit(Btr
17060 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  ee *p, sqlite3_i
17070 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
17080 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17090 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
170a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
170b0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
170c0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
170d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
170e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
170f0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
17100 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20  ager, szMmap);. 
17110 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17120 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
17140 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
17150 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
17160 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17170 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
17180 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
17190 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
171a0 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
171b0 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
171c0 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
171d0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
171e0 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
171f0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
17200 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
17210 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
17220 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
17230 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
17240 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
17250 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
17260 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
17270 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
17280 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
17290 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
172a0 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
172b0 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
172c0 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
172d0 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
172e0 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
172f0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
17300 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
17310 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
17320 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17330 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
17340 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
17350 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28  eeSetPagerFlags(
17360 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
17370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17380 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
17390 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
173a0 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
173b0 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a  pgFlags       /*
173c0 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a   Various PAGER_*
173d0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42   flags */.){.  B
173e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
173f0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
17400 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17410 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17420 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17430 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
17440 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
17450 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
17460 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c   pgFlags);.  sql
17470 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17480 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17490 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
174a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
174b0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
174c0 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
174d0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
174e0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
174f0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
17500 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
17510 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
17520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
17530 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
17540 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
17550 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
17560 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
17570 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
17580 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
17590 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
175a0 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
175b0 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
175c0 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
175d0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
175e0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
175f0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
17600 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
17610 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
17620 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
17630 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
17640 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
17650 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
17660 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
17670 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
17680 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
17690 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
176a0 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
176b0 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
176c0 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
176d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
176e0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
176f0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
17700 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
17710 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
17720 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
17730 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
17740 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
17750 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
17760 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
17770 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
17780 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
17790 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
177a0 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
177b0 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
177c0 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
177d0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
177e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
177f0 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
17800 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
17810 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
17820 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
17830 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17840 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
17850 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
17860 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
17870 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
17880 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
17890 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
178a0 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
178b0 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65  ODEC.  if( nRese
178c0 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  rve>pBt->optimal
178d0 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f  Reserve ) pBt->o
178e0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20  ptimalReserve = 
178f0 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65  (u8)nReserve;.#e
17900 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e  ndif.  if( pBt->
17910 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
17920 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
17930 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
17940 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
17950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
17960 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
17970 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
17980 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
17990 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
179a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
179b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
179c0 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
179d0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
179e0 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
179f0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
17a00 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
17a10 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
17a20 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
17a30 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
17a40 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
17a50 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
17a60 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
17a70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
17a80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
17a90 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
17aa0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
17ab0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
17ac0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
17ad0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
17ae0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
17af0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
17b00 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
17b10 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
17b20 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
17b30 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
17b40 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17b50 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
17b60 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
17b70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17b80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17b90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
17ba0 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
17bb0 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
17bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17bd0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
17be0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
17bf0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
17c00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
17c10 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
17c20 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
17c30 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
17c40 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
17c50 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
17c60 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
17c70 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
17c80 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
17c90 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
17ca0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
17cb0 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
17cc0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
17cd0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
17ce0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
17cf0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
17d00 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
17d10 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
17d20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
17d30 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
17d40 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
17d50 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
17d60 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
17d70 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
17d80 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
17d90 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
17da0 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
17db0 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
17dc0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
17dd0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
17de0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
17df0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
17e00 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
17e10 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
17e20 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
17e30 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
17e40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17e50 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
17e60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d  >mutex) );.  n =
17e70 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
17e80 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
17e90 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  leSize;.  return
17ea0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   n;.}../*.** Ret
17eb0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17ec0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
17ed0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
17ee0 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
17ef0 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
17f00 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
17f10 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
17f20 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
17f30 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
17f40 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
17f50 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ions..**.** If S
17f60 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20  QLITE_HAS_MUTEX 
17f70 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
17f80 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  the number retur
17f90 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72  ned is the.** gr
17fa0 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72  eater of the cur
17fb0 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70  rent reserved sp
17fc0 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ace and the maxi
17fd0 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  mum requested.**
17fe0 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a   reserve space..
17ff0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18000 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73  reeGetOptimalRes
18010 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
18020 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
18030 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18040 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74  .  n = sqlite3Bt
18050 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
18060 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20  utex(p);.#ifdef 
18070 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18080 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d  .  if( n<p->pBt-
18090 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
180a0 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70  ) n = p->pBt->op
180b0 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65  timalReserve;.#e
180c0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74  ndif.  sqlite3Bt
180d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
180e0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
180f0 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
18100 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
18110 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
18120 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
18130 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
18140 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
18150 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
18160 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
18170 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
18180 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
18190 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
181a0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
181b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
181c0 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
181d0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
181e0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
181f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18200 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
18210 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
18220 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
18230 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
18240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
18260 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
18270 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74  the values for t
18280 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
18290 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45  LETE and BTS_OVE
182a0 52 57 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a  RWRITE flags:.**
182b0 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
182c0 30 20 20 20 20 20 20 20 42 6f 74 68 20 42 54 53  0       Both BTS
182d0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61  _SECURE_DELETE a
182e0 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
182f0 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
18300 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20     newFlag==1   
18310 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44      BTS_SECURE_D
18320 45 4c 45 54 45 20 73 65 74 20 61 6e 64 20 42 54  ELETE set and BT
18330 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 63  S_OVERWRITE is c
18340 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77  leared.**    new
18350 46 6c 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54  Flag==2       BT
18360 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
18370 63 6c 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f  cleared and BTS_
18380 4f 56 45 52 57 52 49 54 45 20 69 73 20 73 65 74  OVERWRITE is set
18390 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
183a0 28 2d 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67  (-1)    No chang
183b0 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  es.**.** This ro
183c0 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20  utine acts as a 
183d0 71 75 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67  query if newFlag
183e0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
183f0 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54  ro.**.** With BT
18400 53 5f 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c  S_OVERWRITE set,
18410 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74   deleted content
18420 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
18430 62 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a  by zeros, but.**
18440 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70   freelist leaf p
18450 61 67 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69  ages are not wri
18460 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
18470 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 75 73   database.  Thus
18480 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65   in-page.** dele
18490 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63  ted content is c
184a0 6c 65 61 72 65 64 2c 20 62 75 74 20 66 72 65 65  leared, but free
184b0 6c 69 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e  list deleted con
184c0 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a  tent is not..**.
184d0 2a 2a 20 57 69 74 68 20 42 54 53 5f 53 45 43 55  ** With BTS_SECU
184e0 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61  RE_DELETE, opera
184f0 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53  tion is like BTS
18500 5f 4f 56 45 52 57 52 49 54 45 20 77 69 74 68 20  _OVERWRITE with 
18510 74 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20  the addition.** 
18520 74 68 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65  that freelist le
18530 61 66 20 70 61 67 65 73 20 61 72 65 20 77 72 69  af pages are wri
18540 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
18550 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63  he database, inc
18560 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61  reasing.** the a
18570 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f  mount of disk I/
18580 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  O..*/.int sqlite
18590 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
185a0 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
185b0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
185c0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
185d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
185e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
185f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53  );.  assert( BTS
18600 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f  _OVERWRITE==BTS_
18610 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20  SECURE_DELETE*2 
18620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53  );.  assert( BTS
18630 5f 46 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42  _FAST_SECURE==(B
18640 54 53 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53  TS_OVERWRITE|BTS
18650 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20  _SECURE_DELETE) 
18660 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
18670 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
18680 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
18690 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b  BTS_FAST_SECURE;
186a0 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
186b0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
186c0 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c  URE_DELETE*newFl
186d0 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70  ag;.  }.  b = (p
186e0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
186f0 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52  & BTS_FAST_SECUR
18700 45 29 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45  E)/BTS_SECURE_DE
18710 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42  LETE;.  sqlite3B
18720 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18730 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a  return b;.}../*.
18740 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
18750 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
18760 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
18770 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
18780 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
18790 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
187a0 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
187b0 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
187c0 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
187d0 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
187e0 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
187f0 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
18800 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
18810 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
18820 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
18830 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
18840 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
18850 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18860 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
18870 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
18880 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
18890 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
188a0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
188b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
188c0 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
188d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
188e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
188f0 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
18900 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
18910 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18920 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
18930 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
18940 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
18950 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
18960 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
18970 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
18980 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
18990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
189a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
189b0 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
189c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
189d0 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
189e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
189f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18a00 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
18a10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
18a20 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
18a30 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
18a40 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
18a50 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
18a60 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
18a70 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
18a80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18a90 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
18aa0 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
18ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18ac0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
18ad0 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
18ae0 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
18af0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
18b00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18b10 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
18b20 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
18b30 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
18b40 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
18b50 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
18b60 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
18b70 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
18b80 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18b90 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
18ba0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18bb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
18bc0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
18bd0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6e  f the user has n
18be0 6f 74 20 73 65 74 20 74 68 65 20 73 61 66 65 74  ot set the safet
18bf0 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73  y-level for this
18c00 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
18c10 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50  tion.** using "P
18c20 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
18c30 73 22 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73  s", and if the s
18c40 61 66 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e  afety-level is n
18c50 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  ot already.** se
18c60 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  t to the value p
18c70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
18c80 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65  nction as the se
18c90 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a  cond parameter,.
18ca0 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f  ** set it so..*/
18cb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
18cc0 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21  ULT_SYNCHRONOUS!
18cd0 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  =SQLITE_DEFAULT_
18ce0 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20  WAL_SYNCHRONOUS 
18cf0 5c 0a 20 20 20 20 26 26 20 21 64 65 66 69 6e 65  \.    && !define
18d00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
18d10 4c 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  L).static void s
18d20 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
18d30 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  g(BtShared *pBt,
18d40 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c   u8 safety_level
18d50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
18d60 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69  ;.  Db *pDb;.  i
18d70 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21  f( (db=pBt->db)!
18d80 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61  =0 && (pDb=db->a
18d90 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68  Db)!=0 ){.    wh
18da0 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30  ile( pDb->pBt==0
18db0 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42   || pDb->pBt->pB
18dc0 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b  t!=pBt ){ pDb++;
18dd0 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e   }.    if( pDb->
18de0 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20  bSyncSet==0 .   
18df0 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79    && pDb->safety
18e00 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c  _level!=safety_l
18e10 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44  evel .     && pD
18e20 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a  b!=&db->aDb[1] .
18e30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62      ){.      pDb
18e40 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ->safety_level =
18e50 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20   safety_level;. 
18e60 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18e70 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
18e80 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
18e90 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
18ea0 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20  el | (db->flags 
18eb0 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41  & PAGER_FLAGS_MA
18ec0 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  SK));.    }.  }.
18ed0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
18ee0 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
18ef0 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c  lag(pBt,safety_l
18f00 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  evel).#endif../*
18f10 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
18f20 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
18f30 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
18f40 74 53 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a  tShared*);.../*.
18f50 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
18f60 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
18f70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18f80 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
18f90 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
18fa0 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
18fb0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
18fc0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
18fd0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
18fe0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
18ff0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
19000 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
19010 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
19020 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
19030 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
19040 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
19050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
19060 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
19070 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
19080 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
19090 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
190a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
190b0 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
190c0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
190d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
190e0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
190f0 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
19100 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
19110 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
19120 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
19130 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
19140 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
19150 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19160 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19170 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
19180 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
19190 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
191a0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
191b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
191c0 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
191d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
191e0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
191f0 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
19200 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
19210 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19220 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19230 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
19240 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
19250 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19260 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
19270 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
19280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19290 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
192a0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
192b0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
192c0 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
192d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
192e0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
192f0 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
19300 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
19310 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
19320 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
19330 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
19340 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
19350 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
19360 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
19370 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
19380 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
19390 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
193a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
193b0 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
193c0 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
193d0 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
193e0 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
193f0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
19400 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
19410 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
19420 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e    }.  if( (pBt->
19430 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19440 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
19450 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
19460 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
19470 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
19480 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
19490 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
194a0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
194b0 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
194c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
194d0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
194e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
194f0 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
19500 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
19510 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
19520 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
19530 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
19540 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
19550 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
19560 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
19570 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
19580 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
19590 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
195a0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
195b0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
195c0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
195d0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
195e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
195f0 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
19600 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
19610 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
19620 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
19630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19640 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
19650 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
19660 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
19670 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
19680 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
19690 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
196a0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
196b0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
196c0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
196d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
196e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
196f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
19700 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
19710 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
19720 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
19730 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
19740 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
19750 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
19760 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
19770 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
19780 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
19790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
197a0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
197b0 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
197c0 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
197d0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
197e0 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
197f0 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
19800 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
19810 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
19820 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
19830 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
19840 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
19850 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
19860 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
19870 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
19880 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
19890 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
198a0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
198b0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
198c0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
198d0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
198e0 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
198f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
19900 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
19910 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19920 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
19930 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
19940 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19960 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19970 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19990 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
199a0 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
199b0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
199c0 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20  NCHRONOUS+1);.  
199d0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
199e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
199f0 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
19a00 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
19a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19a20 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
19a40 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
19a50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19a60 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
19a70 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
19a80 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
19a90 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23  NOUS+1);.    }.#
19aa0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
19ab0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
19ac0 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
19ad0 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
19ae0 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
19af0 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
19b00 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
19b10 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
19b20 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
19b30 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
19b40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
19b50 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
19b60 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
19b70 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
19b80 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
19b90 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
19ba0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
19bb0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
19bc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
19bd0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
19be0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
19bf0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
19c00 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19c10 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
19c20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19c30 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
19c40 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
19c50 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19c60 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
19c70 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
19c80 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
19c90 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
19ca0 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
19cb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
19cc0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
19cd0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
19ce0 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
19cf0 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
19d00 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
19d10 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19d20 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
19d30 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
19d40 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
19d50 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
19d60 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
19d70 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
19d80 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
19d90 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
19da0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
19db0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
19dc0 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
19dd0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
19de0 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
19df0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19e00 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19e10 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
19e20 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
19e30 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19e40 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
19e50 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
19e60 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
19e70 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
19e80 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
19e90 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
19ea0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
19eb0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
19ec0 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
19ed0 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
19ee0 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
19ef0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
19f00 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
19f10 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
19f20 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
19f30 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
19f40 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19f50 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
19f60 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
19f70 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
19f80 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
19f90 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
19fa0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
19fb0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
19fc0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
19fd0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
19fe0 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
19ff0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
1a000 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
1a010 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
1a020 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1a030 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
1a040 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
1a050 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
1a060 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
1a070 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
1a080 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1a090 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
1a0a0 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
1a0b0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
1a0c0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
1a0d0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
1a0e0 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
1a0f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
1a100 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
1a110 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
1a120 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
1a130 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1a140 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
1a150 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
1a160 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1a170 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
1a180 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
1a190 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
1a1a0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
1a1b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
1a1c0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
1a1d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a1e0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1a1f0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
1a200 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
1a240 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
1a250 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a260 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
1a270 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1a280 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
1a290 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
1a2a0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
1a2b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1a2c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1a2d0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a2e0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
1a2f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a300 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
1a310 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
1a320 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
1a330 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
1a340 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
1a350 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1a360 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
1a370 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
1a380 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
1a390 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
1a3a0 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
1a3b0 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
1a3c0 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
1a3d0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1a3e0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1a3f0 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
1a400 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1a410 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
1a420 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
1a430 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a440 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1a450 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
1a460 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
1a470 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
1a480 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
1a490 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
1a4a0 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
1a4b0 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
1a4c0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
1a4d0 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
1a4e0 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
1a4f0 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
1a500 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
1a510 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
1a520 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
1a530 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
1a540 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
1a550 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
1a560 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
1a570 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
1a580 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
1a590 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
1a5a0 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
1a5b0 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
1a5c0 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
1a5d0 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
1a5e0 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
1a5f0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1a600 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
1a610 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
1a620 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
1a630 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
1a640 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
1a650 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
1a660 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
1a670 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
1a680 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
1a690 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
1a6a0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
1a6b0 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
1a6c0 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
1a6d0 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
1a6e0 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
1a6f0 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
1a700 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
1a710 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
1a720 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
1a730 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1a740 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
1a750 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
1a760 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
1a770 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1a780 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
1a790 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
1a7a0 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
1a7b0 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
1a7c0 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
1a7d0 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
1a7e0 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
1a7f0 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
1a800 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
1a810 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
1a820 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
1a830 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
1a840 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
1a850 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
1a860 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
1a870 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
1a880 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
1a890 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
1a8a0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
1a8b0 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
1a8c0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
1a8d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a8e0 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
1a8f0 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
1a900 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1a910 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
1a920 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1a930 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1a940 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
1a950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1a960 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70  ursors open on p
1a970 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  Bt. This is for 
1a980 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
1a990 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
1a9a0 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
1a9b0 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
1a9c0 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
1a9d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77  ed..**.** Only w
1a9e0 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
1a9f0 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e   counted if wrOn
1aa00 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ly is true.  If 
1aa10 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c  wrOnly is.** fal
1aa20 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73  se then all curs
1aa30 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e  ors are counted.
1aa40 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
1aa50 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
1aa60 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f  routine, a curso
1aa70 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
1aa80 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
1aa90 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72  le of reading or
1aaa0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1aab0 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f  database.  Curso
1aac0 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  rs that.** have 
1aad0 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74  been tripped int
1aae0 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55  o the CURSOR_FAU
1aaf0 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74  LT state are not
1ab00 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61   counted..*/.sta
1ab10 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c  tic int countVal
1ab20 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  idCursors(BtShar
1ab30 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f  ed *pBt, int wrO
1ab40 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
1ab50 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
1ab60 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
1ab70 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
1ab80 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
1ab90 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
1aba0 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43  wrOnly==0 || (pC
1abb0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
1abc0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d  TCF_WriteFlag)!=
1abd0 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  0).     && pCur-
1abe0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1abf0 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
1ac00 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
1ac10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
1ac20 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
1ac30 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
1ac40 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
1ac50 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
1ac60 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
1ac70 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
1ac80 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
1ac90 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
1aca0 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1acb0 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
1acc0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1acd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
1ace0 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
1acf0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
1ad00 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
1ad10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1ad20 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
1ad30 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
1ad40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1ad50 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1ad60 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
1ad70 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
1ad80 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
1ad90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ada0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1adb0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1adc0 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1add0 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20  rs(pBt,0)==0 || 
1ade0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1adf0 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
1ae00 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
1ae10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1ae20 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
1ae30 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d  age1!=0 ){.    M
1ae40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1ae50 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1ae60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31    assert( pPage1
1ae70 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
1ae80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
1ae90 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
1aea0 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
1aeb0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
1aec0 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
1aed0 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1aee0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1aef0 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
1af00 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
1af10 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
1af20 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
1af30 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
1af40 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
1af50 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
1af60 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
1af70 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1af80 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
1af90 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
1afa0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1afb0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
1afc0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
1afd0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1afe0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1aff0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1b000 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
1b010 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
1b020 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b030 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
1b040 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
1b050 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
1b060 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
1b070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b080 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
1b090 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1b0a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
1b0b0 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
1b0c0 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
1b0d0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
1b0e0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
1b0f0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
1b100 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
1b110 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
1b120 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
1b130 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
1b140 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
1b150 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
1b160 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
1b170 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
1b180 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
1b190 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
1b1a0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
1b1b0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
1b1c0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
1b1d0 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
1b1e0 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
1b1f0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
1b200 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
1b210 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
1b220 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
1b230 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
1b240 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
1b250 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
1b260 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
1b270 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
1b280 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
1b290 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1b2a0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
1b2b0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
1b2c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b2d0 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
1b2e0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
1b2f0 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
1b300 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
1b310 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
1b320 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
1b330 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
1b340 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1b350 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
1b360 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
1b370 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1b380 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
1b390 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
1b3a0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
1b3b0 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
1b3c0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
1b3d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b3e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
1b3f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1b400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1b410 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
1b420 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
1b430 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
1b440 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
1b450 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
1b460 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
1b470 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1b480 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1b490 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1b4a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b4b0 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
1b4c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1b4d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b4e0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
1b4f0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
1b500 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1b510 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
1b520 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b540 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1b550 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
1b560 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
1b570 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
1b580 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
1b590 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1b5a0 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
1b5b0 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
1b5c0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1b5d0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
1b5e0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
1b5f0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
1b600 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
1b610 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
1b620 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
1b630 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1b640 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
1b650 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
1b660 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
1b670 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
1b680 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
1b690 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
1b6a0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
1b6b0 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
1b6c0 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
1b6d0 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
1b6e0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
1b6f0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1b700 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
1b710 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1b720 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
1b730 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1b740 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
1b750 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1b760 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
1b770 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1b780 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
1b790 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
1b7a0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
1b7b0 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
1b7c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1b7d0 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
1b7e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1b7f0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
1b800 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b810 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
1b820 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b830 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
1b840 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b850 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
1b860 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
1b870 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
1b880 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1b890 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
1b8a0 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
1b8b0 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
1b8c0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
1b8d0 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
1b8e0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
1b8f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
1b900 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
1b910 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
1b920 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1b930 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
1b940 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
1b950 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
1b960 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
1b970 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
1b980 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1b990 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
1b9a0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
1b9b0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
1b9c0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
1b9d0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
1b9e0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
1b9f0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1ba00 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
1ba10 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
1ba20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
1ba30 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
1ba40 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
1ba50 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
1ba60 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
1ba70 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1ba80 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
1ba90 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
1baa0 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
1bab0 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
1bac0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
1bad0 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
1bae0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
1baf0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
1bb00 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
1bb10 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
1bb20 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
1bb30 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
1bb40 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
1bb50 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
1bb60 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
1bb70 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1bb80 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
1bb90 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
1bba0 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
1bbb0 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
1bbc0 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
1bbd0 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
1bbe0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
1bbf0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
1bc00 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68   wrflag){.  BtSh
1bc10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1bc20 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
1bc30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
1bc40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bc50 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1bc60 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1bc70 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1bc80 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1bc90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1bca0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1bcb0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1bcc0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1bcd0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1bce0 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1bcf0 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1bd00 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1bd10 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1bd20 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1bd30 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1bd40 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1bd50 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1bd60 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1bd70 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1bd80 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1bd90 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1bda0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1bdb0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1bdc0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
1bdd0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
1bde0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
1bdf0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
1be00 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
1be10 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1be20 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
1be30 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
1be40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1be50 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
1be60 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
1be70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1be80 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1be90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  {.    sqlite3 *p
1bea0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f  Block = 0;.    /
1beb0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
1bec0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
1bed0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
1bee0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
1bef0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ion .    ** on t
1bf00 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
1bf10 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1bf20 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
1bf30 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20  ansaction is.   
1bf40 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
1bf50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1bf60 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  KED..    */.    
1bf70 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
1bf80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bf90 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
1bfa0 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74       || (pBt->bt
1bfb0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
1bfc0 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a  DING)!=0.    ){.
1bfd0 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1bfe0 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
1bff0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
1c000 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
1c010 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1c020 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d        for(pIter=
1c030 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1c040 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1c050 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
1c060 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1c070 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1c080 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
1c090 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
1c0a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c0b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c0c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c0d0 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73  Block ){.      s
1c0e0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
1c0f0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
1c100 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63  Block);.      rc
1c110 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1c120 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1c130 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1c140 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egun;.    }.  }.
1c150 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
1c160 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
1c170 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
1c180 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
1c190 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
1c1a0 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
1c1b0 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
1c1c0 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
1c1d0 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
1c1e0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
1c1f0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
1c200 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
1c210 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
1c220 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
1c230 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1c240 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
1c250 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
1c260 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1c270 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1c280 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
1c290 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
1c2a0 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
1c2b0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
1c2c0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1c2d0 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
1c2e0 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
1c2f0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
1c300 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
1c310 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
1c320 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
1c330 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
1c340 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
1c350 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1c360 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
1c370 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
1c380 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1c390 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
1c3a0 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
1c3b0 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
1c3c0 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
1c3d0 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
1c3e0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1c3f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c400 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
1c410 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
1c420 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
1c430 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
1c440 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
1c450 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
1c460 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
1c470 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
1c480 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
1c490 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
1c4a0 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
1c4b0 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
1c4c0 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
1c4d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c4e0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1c4f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
1c500 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1c510 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
1c520 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c530 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1c540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c560 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
1c570 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
1c580 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
1c590 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
1c5a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c5b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c5c0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1c5d0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1c5e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c5f0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
1c600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c610 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
1c620 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1c630 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
1c640 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
1c650 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
1c660 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1c670 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
1c680 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
1c690 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
1c6a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
1c6b0 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f  erResetLockTimeo
1c6c0 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ut(pBt->pPager);
1c6d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1c6e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1c6f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1c700 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1c710 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1c720 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
1c730 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1c740 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
1c750 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
1c760 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c770 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
1c780 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
1c790 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
1c7a0 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
1c7b0 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
1c7c0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
1c7d0 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1c7e0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
1c7f0 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
1c800 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1c810 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
1c820 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
1c830 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
1c840 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
1c850 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
1c860 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1c870 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1c880 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
1c890 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
1c8a0 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1c8b0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
1c8c0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1c8d0 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
1c8e0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1c8f0 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
1c900 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
1c910 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
1c920 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
1c930 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1c940 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
1c950 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
1c960 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
1c970 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
1c980 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
1c990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1c9a0 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
1c9b0 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
1c9c0 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
1c9d0 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
1c9e0 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
1c9f0 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
1ca00 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
1ca10 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
1ca20 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
1ca30 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
1ca40 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
1ca50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1ca60 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
1ca70 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
1ca80 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1ca90 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
1caa0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
1cab0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
1cac0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
1cad0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1cae0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1caf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1cb00 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
1cb10 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1cb20 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
1cb30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cb40 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1cb50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1cb60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1cb70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cb80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1cb90 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1cba0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1cbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1cbc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
1cbd0 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
1cbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cbf0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
1cc00 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
1cc10 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
1cc20 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
1cc30 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
1cc40 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
1cc50 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
1cc60 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1cc70 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
1cc80 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
1cc90 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
1cca0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
1ccb0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
1ccc0 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
1ccd0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1cce0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1ccf0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1cd00 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
1cd10 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
1cd20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1cd30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1cd40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1cd50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1cd60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1cd70 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1cd80 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1cd90 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1cda0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1cdb0 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1cdc0 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1cdd0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1cde0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1cdf0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1ce00 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1ce10 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1ce20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1ce30 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1ce40 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1ce50 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1ce60 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1ce70 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce90 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1cea0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1ceb0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1cec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ced0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1cee0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1cef0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1cf20 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1cf30 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1cf40 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  Bt;.  Pgno pgno 
1cf50 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1cf60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cf70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1cf80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1cf90 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d  );.  rc = pPage-
1cfa0 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1cfb0 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1cfc0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1cfd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cfe0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1cff0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1d000 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1d010 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1d020 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1d030 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1d040 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1d050 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1d060 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1d070 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1d080 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1d090 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1d0a0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1d0b0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1d0c0 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1d0d0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1d0e0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1d0f0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1d100 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1d110 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1d120 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1d130 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1d140 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1d150 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1d160 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1d170 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1d180 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1d190 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1d1a0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
1d1b0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1d1c0 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
1d1d0 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
1d1e0 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
1d1f0 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
1d200 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
1d210 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
1d220 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
1d230 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
1d240 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
1d250 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
1d260 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
1d270 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1d280 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d290 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
1d2c0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1d2d0 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
1d2e0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1d2f0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1d300 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
1d310 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d320 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
1d330 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
1d340 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
1d350 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1d360 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
1d370 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1d380 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1d390 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
1d3a0 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
1d3b0 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
1d3c0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1d3d0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1d3e0 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
1d3f0 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
1d400 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
1d410 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
1d420 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
1d430 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d440 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1d450 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1d460 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1d470 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1d480 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1d490 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d4a0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
1d4b0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
1d4c0 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
1d4d0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
1d4e0 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
1d4f0 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
1d500 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
1d510 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
1d520 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
1d530 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1d540 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1d550 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1d560 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1d570 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1d580 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1d590 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1d5a0 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   rc;..    rc = p
1d5b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1d5c0 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1d5d0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1d5e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1d5f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1d600 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1d610 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1d620 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1d630 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1d640 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1d650 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1d660 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1d670 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1d680 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1d690 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1d6a0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1d6b0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1d6c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1d6d0 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
1d6e0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
1d6f0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69       if( pCell+i
1d700 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67  nfo.nSize > pPag
1d710 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1d720 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1d730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1d740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d750 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
1d760 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d770 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
1d780 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c  m==get4byte(pCel
1d790 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20  l+info.nSize-4) 
1d7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1d7b0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  ut4byte(pCell+in
1d7c0 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29  fo.nSize-4, iTo)
1d7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1d7e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1d7f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d810 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
1d820 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
1d830 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d840 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
1d850 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d870 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1d880 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
1d890 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
1d8a0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
1d8b0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
1d8c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1d8d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1d8e0 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
1d8f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1d900 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1d910 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
1d920 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1d930 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1d940 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1d950 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1d960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1d980 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1d990 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1d9a0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1d9b0 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1d9c0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1d9d0 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1d9e0 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1d9f0 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1da00 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1da10 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1da20 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1da30 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1da40 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1da50 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1da60 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1da70 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1da80 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1da90 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1daa0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1dab0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1dac0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1dad0 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1dae0 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1daf0 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1db00 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1db10 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1db20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1db30 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1db40 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1db50 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db70 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1db80 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1db90 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1dba0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1dbb0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1dbc0 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1dbd0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1dbe0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1dbf0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1dc00 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1dc10 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1dc20 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc40 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1dc50 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1dc60 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1dc70 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1dc80 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1dc90 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1dca0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1dcb0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1dcc0 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1dcd0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1dce0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1dcf0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1dd00 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1dd10 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1dd20 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1dd30 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1dd40 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1dd50 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1dd60 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1dd70 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1dd80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1dd90 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1dda0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1ddb0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1ddc0 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
1ddd0 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
1dde0 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
1ddf0 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
1de00 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
1de10 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
1de20 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
1de30 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
1de40 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
1de50 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
1de60 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
1de70 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
1de80 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
1de90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1dea0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
1deb0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
1dec0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1ded0 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
1dee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1def0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1df00 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
1df10 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
1df20 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
1df30 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
1df40 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
1df50 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
1df60 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
1df70 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
1df80 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1df90 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
1dfa0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1dfb0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
1dfc0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
1dfd0 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
1dfe0 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
1dff0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
1e000 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
1e010 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
1e020 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
1e030 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
1e040 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
1e050 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1e060 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
1e070 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
1e080 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1e090 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
1e0a0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1e0b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1e0c0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1e0d0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1e0e0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1e0f0 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
1e100 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
1e110 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1e120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e140 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1e150 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
1e160 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
1e170 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
1e180 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
1e190 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1e1a0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
1e1b0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1e1c0 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
1e1d0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1e1e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e1f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1e200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e210 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
1e220 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
1e230 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
1e240 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
1e250 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
1e260 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
1e270 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
1e280 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
1e290 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
1e2a0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
1e2b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1e2c0 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
1e2d0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1e2e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1e2f0 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
1e300 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
1e310 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e320 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1e330 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e340 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e350 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
1e360 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1e370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e380 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1e390 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1e3a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e3c0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1e3d0 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
1e3e0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1e3f0 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
1e400 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1e410 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1e420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e430 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1e440 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1e450 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
1e460 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1e470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e480 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1e490 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1e4a0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1e4b0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
1e4c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1e4d0 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
1e4e0 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
1e4f0 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
1e500 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
1e510 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
1e520 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1e530 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
1e540 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
1e550 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1e560 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
1e570 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
1e580 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
1e590 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
1e5a0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
1e5b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1e5c0 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
1e5d0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1e5e0 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
1e5f0 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
1e600 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
1e610 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
1e620 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1e630 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
1e640 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
1e650 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1e660 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
1e670 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1e680 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
1e690 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
1e6a0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
1e6b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1e6c0 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
1e6d0 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
1e6e0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
1e6f0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1e700 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1e710 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
1e720 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
1e730 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
1e740 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
1e750 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
1e760 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
1e770 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
1e780 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
1e790 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
1e7a0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1e7b0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
1e7c0 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
1e7d0 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
1e7e0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
1e7f0 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
1e800 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
1e810 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
1e820 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
1e830 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
1e840 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
1e850 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
1e860 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
1e870 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1e880 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
1e890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e8a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1e8b0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
1e8c0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
1e8d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1e8e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e8f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1e900 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
1e910 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
1e920 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
1e930 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
1e940 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
1e950 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e960 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
1e970 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
1e980 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
1e990 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
1e9a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e9b0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
1e9c0 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
1e9d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e9e0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1e9f0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1ea00 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
1ea10 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
1ea20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ea30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ea40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ea50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
1ea60 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1ea70 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
1ea80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ea90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1eaa0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1eab0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1eac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
1ead0 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1eae0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1eaf0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
1eb00 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
1eb10 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
1eb20 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
1eb30 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
1eb40 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
1eb50 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
1eb60 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
1eb70 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
1eb80 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
1eb90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1eba0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
1ebb0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
1ebc0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
1ebd0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
1ebe0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
1ebf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1ec00 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1ec10 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
1ec20 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1ec30 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1ec40 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1ec50 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1ec60 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
1ec70 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
1ec80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ec90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1eca0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ecb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ecc0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1ecd0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
1ece0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ecf0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1ed00 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
1ed10 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
1ed20 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
1ed30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
1ed40 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
1ed50 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
1ed60 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
1ed70 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
1ed80 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
1ed90 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
1eda0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1edb0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1edc0 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
1edd0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
1ede0 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
1edf0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1ee00 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1ee10 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
1ee20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1ee30 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
1ee40 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1ee50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ee60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ee70 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
1ee80 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
1ee90 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
1eea0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
1eeb0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
1eec0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
1eed0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
1eee0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1eef0 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
1ef00 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
1ef10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1ef20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
1ef30 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
1ef40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
1ef50 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
1ef60 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
1ef70 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
1ef80 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
1ef90 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
1efa0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
1efb0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
1efc0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
1efd0 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1efe0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
1eff0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
1f000 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
1f010 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
1f020 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
1f030 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1f040 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1f050 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1f060 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1f070 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
1f080 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
1f090 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f0a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f0b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1f0c0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
1f0d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1f0f0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1f100 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
1f110 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
1f120 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
1f130 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1f140 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
1f150 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
1f160 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
1f170 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
1f180 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
1f190 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
1f1a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1f1b0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1f1c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f1d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f1e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f1f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1f200 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1f210 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1f220 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
1f230 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
1f240 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f250 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
1f260 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1f270 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
1f280 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1f290 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
1f2a0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
1f2b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f2c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1f2d0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1f2e0 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
1f2f0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
1f300 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1f310 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
1f320 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
1f330 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
1f340 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
1f350 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
1f360 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f370 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
1f380 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
1f390 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
1f3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
1f3b0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
1f3c0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1f3d0 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
1f3e0 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
1f3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f400 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f410 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
1f420 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
1f430 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f460 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
1f470 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
1f480 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4a0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1f4b0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
1f4c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
1f4d0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
1f4e0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
1f4f0 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
1f500 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
1f510 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
1f520 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
1f530 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
1f540 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
1f550 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
1f560 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f570 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1f580 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
1f590 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1f5a0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
1f5b0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
1f5c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1f5d0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
1f5e0 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
1f5f0 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
1f600 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1f610 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
1f620 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1f630 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
1f640 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
1f650 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
1f660 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
1f670 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
1f680 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
1f690 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
1f6a0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
1f6b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
1f6c0 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
1f6d0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
1f6e0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
1f6f0 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
1f700 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
1f710 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f720 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1f730 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
1f740 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
1f750 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
1f760 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
1f770 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1f780 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f790 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
1f7a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f7b0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1f7c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1f7d0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
1f7e0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1f7f0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
1f800 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f810 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1f820 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1f830 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
1f840 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1f850 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
1f860 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1f870 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1f880 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1f890 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
1f8a0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1f8b0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
1f8c0 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
1f8d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1f8e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f8f0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1f900 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1f910 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1f920 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1f930 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f950 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
1f960 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1f970 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
1f980 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1f990 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
1f9a0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
1f9b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f9c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f9d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f9e0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1f9f0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1fa00 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1fa10 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1fa20 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1fa30 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
1fa40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fa50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1fa60 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
1fa70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1fa80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1fa90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1faa0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1fab0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
1fac0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
1fad0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
1fae0 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
1faf0 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1fb00 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
1fb10 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1fb20 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1fb30 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
1fb40 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1fb50 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
1fb60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1fb70 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1fb80 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
1fb90 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1fba0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
1fbb0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1fbc0 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1fbd0 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1fbe0 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1fbf0 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1fc00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1fc10 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1fc20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1fc30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1fc40 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1fc50 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1fc60 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1fc70 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1fc80 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1fc90 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61  (pPager); )..  a
1fca0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1fcb0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1fcc0 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1fcd0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1fce0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1fcf0 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1fd00 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1fd10 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1fd20 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fd40 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1fd50 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1fd60 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1fd70 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1fd80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fd90 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1fda0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1fdb0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1fdc0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1fdd0 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1fde0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1fdf0 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1fe00 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1fe10 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1fe20 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1fe30 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1fe40 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1fe50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1fe60 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1fe70 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1fe80 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1fe90 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1fea0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1feb0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1fec0 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1fed0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1fee0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1fef0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1ff00 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1ff10 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1ff20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1ff30 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1ff40 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1ff50 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1ff60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ff70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ff80 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1ff90 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1ffa0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1ffb0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1ffc0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1ffd0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1ffe0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1fff0 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
20000 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20010 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
20020 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
20030 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
20040 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
20050 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
20060 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
20070 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
20080 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
20090 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
200a0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
200b0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
200c0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
200d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
200e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
200f0 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
20100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20110 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
20120 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20130 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
20140 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
20150 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
20160 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20170 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20180 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
20190 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
201a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
201b0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
201c0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
201d0 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
201e0 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
201f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
20200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20210 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
20220 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
20230 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
20240 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
20250 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
20260 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
20270 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
20280 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
20290 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
202a0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
202b0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
202c0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
202d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
202e0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
202f0 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
20300 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
20310 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
20320 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
20330 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
20340 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
20350 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
20360 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
20370 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
20380 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
20390 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
203a0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
203b0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
203c0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
203d0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
203e0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
203f0 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
20400 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
20410 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
20420 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
20430 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
20440 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
20450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
20460 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
20470 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
20480 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
20490 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
204a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
204b0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
204c0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
204d0 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
204e0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
204f0 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
20500 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
20510 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
20520 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
20530 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
20540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
20550 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
20560 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
20570 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
20580 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
20590 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
205a0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
205b0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
205c0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
205d0 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
205e0 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
205f0 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
20600 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
20610 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
20620 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
20630 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
20640 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
20650 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
20660 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20670 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
20680 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
20690 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
206a0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
206b0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
206c0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
206d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
206e0 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
206f0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
20700 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
20710 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
20720 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20730 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
20740 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
20750 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
20760 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
20770 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
20780 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
20790 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
207a0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
207b0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
207c0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
207d0 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
207e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
207f0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
20800 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
20810 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
20820 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20830 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20840 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
20850 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
20860 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
20870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
20880 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20890 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
208a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
208b0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
208c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
208d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
208e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
208f0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
20900 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
20910 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
20920 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
20930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20950 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20960 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
20970 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20980 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20990 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
209a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
209b0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
209c0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
209d0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
209e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
209f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
20a00 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
20a10 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
20a20 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
20a30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20a40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
20a60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20a70 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
20a80 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
20a90 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
20aa0 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
20ab0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
20ac0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
20ad0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
20ae0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
20af0 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
20b00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20b10 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
20b20 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
20b30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
20b40 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
20b50 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
20b60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20b70 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
20b80 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
20b90 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
20ba0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
20bb0 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
20bc0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
20bd0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
20be0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
20bf0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
20c00 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
20c10 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
20c20 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
20c30 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
20c40 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
20c50 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
20c60 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
20c70 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
20c80 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
20c90 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
20ca0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
20cb0 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
20cc0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
20cd0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
20ce0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
20cf0 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
20d00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
20d10 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
20d20 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
20d30 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
20d40 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
20d50 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
20d60 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
20d70 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
20d80 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
20d90 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
20da0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
20db0 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
20dc0 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
20dd0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
20de0 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
20df0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
20e00 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
20e10 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
20e20 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
20e30 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
20e40 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
20e50 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
20e60 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
20e70 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
20e80 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
20e90 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
20ea0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
20eb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
20ec0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
20ed0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
20ee0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
20ef0 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
20f00 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
20f10 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
20f20 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
20f30 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
20f40 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
20f50 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
20f60 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
20f70 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
20f80 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
20f90 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
20fa0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
20fb0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
20fc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20fd0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
20fe0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
20ff0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
21000 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
21010 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21020 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
21030 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
21040 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
21050 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
21060 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
21070 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
21080 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
21090 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
210a0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
210b0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
210c0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
210d0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
210e0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
210f0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
21100 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
21110 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
21120 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
21130 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
21140 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
21150 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
21160 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
21170 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
21180 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
21190 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
211a0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
211b0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
211c0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
211d0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
211e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
211f0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
21200 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
21210 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
21220 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
21230 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
21240 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
21250 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
21260 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
21270 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
21280 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
21290 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
212a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
212b0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
212c0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
212d0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
212e0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
212f0 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
21300 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
21310 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
21320 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
21330 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
21340 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
21350 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
21360 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
21370 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
21380 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
21390 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
213a0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
213b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
213c0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
213d0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
213e0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
213f0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
21400 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
21410 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
21420 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
21430 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
21440 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
21450 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
21460 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
21470 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
21480 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
21490 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
214a0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
214b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
214c0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
214d0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
214e0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
214f0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
21500 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
21510 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
21520 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
21530 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
21540 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
21550 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
21560 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
21570 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
21580 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
21590 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
215a0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
215b0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
215c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
215d0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
215e0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
215f0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
21600 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
21610 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
21620 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
21630 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
21640 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
21650 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
21660 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21670 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
21680 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
21690 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
216a0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
216b0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
216c0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
216d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
216e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
216f0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
21700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21710 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
21720 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21730 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
21740 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21750 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
21760 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
21770 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
21780 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
21790 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
217a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
217b0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
217c0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
217d0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
217e0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
217f0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
21800 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21810 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21830 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
21840 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
21850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21860 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
21870 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
21880 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21890 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
218a0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
218b0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
218c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
218d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
218e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
218f0 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
21900 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
21910 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21920 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21930 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21940 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
21950 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
21960 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
21970 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
21980 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
21990 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
219a0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
219b0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
219c0 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
219d0 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
219e0 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
219f0 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
21a00 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
21a10 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
21a20 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
21a30 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
21a40 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
21a50 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
21a60 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
21a70 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
21a80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21a90 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
21aa0 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
21ab0 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
21ac0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
21ad0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
21ae0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
21af0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
21b00 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
21b10 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
21b20 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
21b30 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
21b40 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
21b50 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
21b60 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
21b70 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
21b80 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
21b90 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
21ba0 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
21bb0 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
21bc0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
21bd0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
21be0 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
21bf0 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
21c00 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
21c10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
21c20 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
21c30 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
21c40 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
21c50 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
21c60 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
21c70 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
21c80 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
21c90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
21ca0 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
21cb0 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
21cc0 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
21cd0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
21ce0 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
21cf0 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
21d00 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
21d10 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
21d20 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
21d30 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
21d40 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
21d50 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
21d60 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
21d70 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
21d80 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
21d90 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
21da0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
21db0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
21dc0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
21dd0 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
21de0 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
21df0 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
21e00 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
21e10 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
21e20 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
21e30 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
21e40 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
21e50 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
21e60 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
21e70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21e80 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
21e90 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
21ea0 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
21eb0 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
21ec0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
21ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
21ee0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
21ef0 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
21f00 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
21f10 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
21f20 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
21f30 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
21f40 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
21f50 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
21f60 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
21f70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21f80 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
21f90 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
21fa0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21fb0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
21fc0 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
21fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21ff0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
22000 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
22010 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
22020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
22030 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22040 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22060 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
22070 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
22080 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
22090 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
220a0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
220b0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
220c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65      }.      btre
220d0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
220e0 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d  rPages(p);.    }
220f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22100 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
22110 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
22130 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
22140 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
22150 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
22160 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
22170 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
22180 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
22190 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
221a0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
221b0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
221c0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
221d0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
221e0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
221f0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
22200 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
22210 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
22220 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
22230 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
22240 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
22250 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
22260 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
22270 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
22280 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
22290 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
222a0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
222b0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
222c0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
222d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
222e0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
222f0 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
22300 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
22310 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
22320 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22330 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
22340 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
22350 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
22360 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
22370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
22380 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
22390 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
223a0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
223b0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
223c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
223d0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
223e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
223f0 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
22400 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
22410 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
22420 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
22430 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
22440 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22450 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
22460 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
22470 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
22480 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
22490 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
224a0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
224b0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
224c0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
224d0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
224e0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
224f0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
22500 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
22510 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
22520 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
22530 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
22540 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
22550 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
22560 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
22570 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
22580 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
22590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
225a0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
225b0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
225c0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
225d0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
225e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
225f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
22600 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
22610 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
22620 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
22630 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
22640 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
22650 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
22660 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
22670 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
22680 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
22690 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
226a0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
226b0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
226c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
226d0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
226e0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
226f0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
22700 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
22710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
22720 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
22730 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
22740 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
22750 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
22760 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
22770 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
22780 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
22790 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
227a0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
227b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
227c0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
227d0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
227e0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
227f0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
22800 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
22810 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
22820 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
22830 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
22840 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
22850 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22870 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
22880 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
22890 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
228a0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
228b0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
228c0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
228d0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
228e0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
228f0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
22900 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
22910 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
22920 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
22930 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
22940 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
22950 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
22960 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
22970 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
22980 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
22990 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
229a0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
229b0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
229c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
229d0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
229e0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
229f0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
22a00 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
22a10 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
22a20 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
22a30 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
22a40 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
22a50 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
22a60 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
22a70 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
22a80 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
22a90 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
22aa0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
22ab0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
22ac0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
22ad0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
22ae0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
22af0 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
22b00 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
22b10 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
22b20 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
22b30 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
22b40 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
22b50 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
22b60 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
22b70 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
22b80 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
22b90 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
22ba0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
22bb0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
22bc0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
22bd0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
22be0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
22bf0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
22c00 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
22c10 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
22c20 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
22c30 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
22c40 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
22c50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22c60 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
22c70 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
22c80 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
22c90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22ca0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
22cb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
22cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
22cd0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22ce0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
22cf0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
22d00 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
22d10 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
22d20 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
22d30 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
22d40 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
22d50 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
22d60 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
22d70 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
22d80 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
22d90 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
22da0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
22db0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
22dc0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
22dd0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
22de0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
22df0 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
22e00 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
22e10 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
22e20 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
22e30 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
22e40 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
22e50 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
22e60 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
22e70 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
22e80 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
22e90 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
22ea0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
22eb0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
22ec0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
22ed0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
22ee0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22ef0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
22f00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
22f10 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
22f20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
22f30 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
22f40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22f50 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
22f60 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
22f70 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
22f80 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
22f90 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
22fa0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
22fb0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
22fc0 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
22fd0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
22fe0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
22ff0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
23000 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
23010 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
23020 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
23030 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
23040 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
23050 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
23060 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
23070 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
23080 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
23090 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
230a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
230b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
230c0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
230d0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
230e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
230f0 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
23100 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
23110 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
23120 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
23130 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
23140 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
23150 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
23160 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
23170 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
23180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
23190 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
231a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
231b0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
231c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
231d0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
231e0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
231f0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
23200 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
23210 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
23220 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
23230 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
23240 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
23250 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
23260 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
23270 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
23280 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
23290 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
232a0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
232b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
232c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
232d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
232e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
232f0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
23300 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
23310 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
23320 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
23340 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
23350 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
23360 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
23370 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
23380 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
23390 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
233a0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
233b0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
233c0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
233d0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
233e0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
233f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
23400 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
23410 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
23420 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
23430 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
23440 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
23450 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
23460 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
23470 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
23480 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
23490 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
234a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
234b0 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
234c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
234d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
234e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
234f0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
23500 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
23510 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
23520 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
23530 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
23540 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
23550 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
23560 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
23570 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
23580 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
23590 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
235a0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
235b0 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
235c0 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
235d0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
235e0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
235f0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
23600 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
23610 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
23620 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
23630 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54  .**.** If the BT
23640 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66  REE_WRCSR bit of
23650 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72   wrFlag is clear
23660 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
23670 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65  r can only.** be
23680 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
23690 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45  g.  If the BTREE
236a0 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65  _WRCSR bit is se
236b0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
236c0 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  or.** can be use
236d0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
236e0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20   for writing if 
236f0 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
23700 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20   for writing.** 
23710 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
23720 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e  hese are the con
23730 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
23740 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
23750 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67  r.** for writing
23760 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a   to be allowed:.
23770 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
23780 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
23790 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
237a0 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e  wrFlag containin
237b0 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  g BTREE_WRCSR.**
237c0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
237d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
237e0 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
237f0 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
23800 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
23810 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
23820 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
23830 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
23840 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
23850 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
23860 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
23870 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
23880 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
23890 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
238a0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
238b0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
238c0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
238d0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
238e0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
238f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23900 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
23910 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
23920 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
23930 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
23940 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
23950 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
23960 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
23970 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  n..**.** The BTR
23980 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74  EE_FORDELETE bit
23990 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f   of wrFlag may o
239a0 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74  ptionally be set
239b0 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a   if BTREE_WRCSR.
239c0 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46  ** is set.  If F
239d0 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c  ORDELETE is set,
239e0 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20   that is a hint 
239f0 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
23a00 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68  ation that.** th
23a10 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f  is cursor will o
23a20 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73  nly be used to s
23a30 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74  eek to and delet
23a40 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20  e entries of an 
23a50 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74  index.** as part
23a60 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c   of a larger DEL
23a70 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ETE statement.  
23a80 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69  The FORDELETE hi
23a90 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  nt is not used b
23aa0 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d  y.** this implem
23ab0 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  entation.  But i
23ac0 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c  n a hypothetical
23ad0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f   alternative sto
23ae0 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20  rage engine .** 
23af0 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65  in which index e
23b00 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d  ntries are autom
23b10 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
23b20 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64   when correspond
23b30 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77  ing table.** row
23b40 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74  s are deleted, t
23b50 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61  he FORDELETE fla
23b60 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74  g is a hint that
23b70 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45   all SEEK and DE
23b80 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  LETE.** operatio
23b90 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ns on this curso
23ba0 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20  r can be no-ops 
23bb0 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65  and all READ ope
23bc0 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20  rations can .** 
23bd0 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f  return a null ro
23be0 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31  w (2-bytes: 0x01
23bf0 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   0x00)..**.** No
23c00 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
23c10 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
23c20 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
23c30 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
23c40 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
23c50 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
23c60 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
23c70 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
23c80 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
23c90 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
23ca0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
23cb0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
23cc0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
23cd0 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
23ce0 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
23cf0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
23d00 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
23d10 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
23d20 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
23d30 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
23d40 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
23d50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
23d80 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23da0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
23db0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
23dc0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
23dd0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
23e00 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
23e10 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
23e20 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
23e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23e40 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
23e50 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
23e60 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
23e70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
23e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
23e90 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
23ea0 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
23eb0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
23ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23ed0 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
23ee0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
23ef0 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20  Cursor *pX;     
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20       /* Looping 
23f20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63  over other all c
23f30 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  ursors */..  ass
23f40 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
23f50 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
23f60 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
23f70 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ag==0 .       ||
23f80 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57   wrFlag==BTREE_W
23f90 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  RCSR .       || 
23fa0 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57  wrFlag==(BTREE_W
23fb0 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45  RCSR|BTREE_FORDE
23fc0 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f  LETE) .  );..  /
23fd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23fe0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
23ff0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
24000 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
24010 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
24020 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
24030 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
24040 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
24050 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
24060 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
24070 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
24080 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
24090 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
240a0 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
240b0 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
240c0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
240d0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
240e0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
240f0 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67  Info!=0, (wrFlag
24100 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65  ?2:1)) );.  asse
24110 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
24120 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
24130 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
24140 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
24150 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
24160 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
24170 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
24180 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
24190 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
241a0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
241b0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
241c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
241d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
241e0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
241f0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
24200 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
24210 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
24220 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
24230 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
24240 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72  ==0 );..  if( wr
24250 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
24260 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
24270 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
24280 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
24290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
242a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
242b0 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
242c0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
242d0 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
242e0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
242f0 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
24300 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
24310 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
24320 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
24330 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
24340 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
24350 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
24360 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
24370 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
24380 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
24390 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
243a0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
243b0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
243c0 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
243d0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
243e0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
243f0 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
24400 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
24410 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
24420 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46  ag ? BTCF_WriteF
24430 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d  lag : 0;.  pCur-
24440 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d  >curPagerFlags =
24450 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41   wrFlag ? 0 : PA
24460 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
24470 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ;.  /* If there 
24480 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
24490 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
244a0 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
244b0 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75  all such.  ** cu
244c0 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76  rsors *must* hav
244d0 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  e the BTCF_Multi
244e0 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f  ple flag set. */
244f0 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70  .  for(pX=pBt->p
24500 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70  Cursor; pX; pX=p
24510 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
24520 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  f( pX->pgnoRoot=
24530 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b  =(Pgno)iTable ){
24540 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c  .      pX->curFl
24550 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
24560 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72  iple;.      pCur
24570 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
24580 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
24590 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
245a0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
245b0 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72  sor;.  pBt->pCur
245c0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
245d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
245e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
245f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24600 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
24610 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
24620 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24640 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24650 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
24660 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
24690 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
246a0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
246b0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
246e0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
246f0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
24700 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
24730 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
24740 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24770 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
24780 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
24790 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61  nt rc;.  if( iTa
247a0 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20  ble<1 ){.    rc 
247b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
247c0 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
247d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
247e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
247f0 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
24800 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
24810 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
24820 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
24830 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
24840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24850 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24860 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
24870 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
24880 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
24890 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
248a0 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
248b0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
248c0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
248d0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
248e0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
248f0 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
24900 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
24910 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
24920 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
24930 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
24940 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
24950 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
24960 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
24970 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24980 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
24990 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
249a0 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
249b0 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
249c0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
249d0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
249e0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
249f0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
24a00 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
24a10 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
24a20 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
24a30 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
24a40 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
24a50 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
24a60 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
24a70 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
24a80 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
24a90 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
24aa0 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
24ab0 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
24ac0 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
24ad0 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
24ae0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
24af0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
24b00 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
24b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
24b20 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
24b30 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
24b40 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
24b50 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54  tof(BtCursor, BT
24b60 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49  CURSOR_FIRST_UNI
24b70 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NIT));.}../*.** 
24b80 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
24b90 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
24ba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24bb0 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
24bc0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
24bd0 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
24be0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24bf0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
24c00 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
24c10 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
24c20 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
24c30 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
24c40 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
24c50 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
24c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24c70 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
24c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
24c90 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
24ca0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
24cb0 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
24cc0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
24cd0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
24ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24cf0 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
24d00 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
24d10 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
24d20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
24d30 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
24d40 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
24d50 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
24d60 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
24d70 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
24d80 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
24d90 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
24da0 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
24db0 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
24dc0 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
24dd0 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
24de0 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63  pCur);.    unloc
24df0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
24e00 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
24e10 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
24e20 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69  rflow);.    sqli
24e30 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
24e40 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
24e50 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
24e60 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
24e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24e80 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
24e90 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
24ea0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
24eb0 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
24ec0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
24ed0 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
24ee0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
24ef0 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
24f00 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
24f10 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
24f20 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
24f30 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
24f40 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
24f50 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
24f60 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
24f70 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
24f80 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
24f90 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
24fa0 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a  ParseCell()..*/.
24fb0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
24fc0 20 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c   static int cell
24fd0 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c 49 6e  InfoEqual(CellIn
24fe0 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f 20  fo *a, CellInfo 
24ff0 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  *b){.    if( a->
25000 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20 29 20  nKey!=b->nKey ) 
25010 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
25020 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21 3d 62  ( a->pPayload!=b
25030 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72 65 74  ->pPayload ) ret
25040 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
25050 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e  ->nPayload!=b->n
25060 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e  Payload ) return
25070 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e   0;.    if( a->n
25080 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c  Local!=b->nLocal
25090 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
250a0 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21 3d 62   if( a->nSize!=b
250b0 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75 72 6e  ->nSize ) return
250c0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   0;.    return 1
250d0 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
250e0 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
250f0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
25100 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
25110 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65   info;.    memse
25120 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
25130 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
25140 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
25150 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
25160 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  >ix, &info);.   
25170 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
25180 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45  _DB || cellInfoE
25190 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70 43 75  qual(&info, &pCu
251a0 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a  r->info) );.  }.
251b0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
251c0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
251d0 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
251e0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
251f0 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
25200 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25210 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  {.  if( pCur->in
25220 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
25230 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
25240 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
25250 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61  Key;.    btreePa
25260 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
25270 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43  age,pCur->ix,&pC
25280 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
25290 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65  se{.    assertCe
252a0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
252b0 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
252c0 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
252d0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
252e0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
252f0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
25300 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
25310 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
25320 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
25330 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
25340 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
25350 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
25360 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
25370 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
25380 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
25390 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
253a0 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
253b0 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
253c0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
253d0 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
253e0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
253f0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
25400 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
25410 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
25420 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25430 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
25440 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c  DEBUG */.int sql
25450 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
25460 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f  sValidNN(BtCurso
25470 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25480 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
25490 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53   return pCur->eS
254a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
254b0 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ID;.}../*.** Ret
254c0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
254d0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
254e0 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20   or "rowid" for 
254f0 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a  a table btree..*
25500 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25510 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72  s only valid for
25520 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
25530 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
25540 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61  a.** ordinary ta
25550 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20 74  ble btree.  If t
25560 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
25570 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72   to an index btr
25580 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61  ee or.** is inva
25590 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20  lid, the result 
255a0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
255b0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
255c0 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
255d0 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75  eIntegerKey(BtCu
255e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
255f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25600 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25610 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25620 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25630 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
25640 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
25650 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ey );.  getCellI
25660 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
25670 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
25680 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Key;.}..#ifdef S
25690 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
256a0 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a  SET_SQL_FUNC./*.
256b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
256c0 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61  fset into the da
256d0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
256e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
256f0 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f 20 77  .** payload to w
25700 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
25710 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a  is pointing..*/.
25720 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
25730 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f 72 20  Offset(BtCursor 
25740 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
25750 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25760 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25770 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25780 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25790 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
257a0 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
257b0 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70 42 74  n (i64)pCur->pBt
257c0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69 36 34  ->pageSize*((i64
257d0 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67  )pCur->pPage->pg
257e0 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20 20 20  no - 1) +.      
257f0 20 20 20 28 69 36 34 29 28 70 43 75 72 2d 3e 69     (i64)(pCur->i
25800 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
25810 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
25820 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  a);.}.#endif /* 
25830 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
25840 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f  FSET_SQL_FUNC */
25850 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25860 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
25870 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f  es of payload fo
25880 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
25890 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72   pCur is.** curr
258a0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
258b0 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74  o.  For table bt
258c0 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
258d0 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  be the amount.**
258e0 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69   of data.  For i
258f0 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69  ndex btrees, thi
25900 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69  s will be the si
25910 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a  ze of the key..*
25920 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
25930 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
25940 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
25950 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
25960 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
25970 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
25980 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
25990 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
259a0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
259b0 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
259c0 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
259d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
259e0 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  D..*/.u32 sqlite
259f0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
25a00 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
25a10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
25a20 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25a30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25a40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25a50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25a60 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
25a70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
25a80 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
25a90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
25aa0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
25ab0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
25ac0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
25ad0 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
25ae0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
25af0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
25b00 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
25b10 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
25b20 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
25b30 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
25b40 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
25b50 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
25b60 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
25b70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
25b80 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
25b90 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
25ba0 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
25bb0 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
25bc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25bd0 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
25be0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
25bf0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
25c00 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
25c10 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
25c20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
25c30 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
25c40 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
25c50 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
25c60 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
25c70 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
25c80 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
25c90 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
25ca0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
25cb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
25cc0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
25cd0 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
25ce0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
25cf0 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
25d00 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
25d10 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
25d20 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
25d30 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
25d40 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
25d50 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
25d60 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
25d70 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
25d80 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
25d90 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
25da0 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
25db0 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
25dc0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
25dd0 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
25de0 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
25df0 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
25e00 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
25e10 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
25e20 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
25e30 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
25e40 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
25e50 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
25e60 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
25e70 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
25e80 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
25e90 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
25ea0 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
25eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
25ec0 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
25ed0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
25ee0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
25f00 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
25f10 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
25f20 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
25f30 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
25f40 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
25f50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
25f60 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
25f70 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
25f80 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
25f90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25fa0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
25fb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
25fc0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
25fd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
25fe0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
25ff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26000 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
26010 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
26020 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
26030 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
26040 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
26050 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
26060 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
26070 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
26080 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
26090 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
260a0 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
260b0 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
260c0 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
260d0 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
260e0 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
260f0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
26100 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
26110 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
26120 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
26130 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
26140 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
26150 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
26160 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
26170 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
26180 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
26190 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
261a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
261b0 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
261c0 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
261d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
261e0 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
261f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
26200 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
26210 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
26220 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
26230 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
26240 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
26250 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26260 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
26270 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
26280 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
26290 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
262a0 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
262b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
262c0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
262d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
262e0 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
262f0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
26300 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
26310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26320 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26330 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
26340 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
26350 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
26360 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
26370 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
26380 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
26390 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
263a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
263b0 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
263c0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
263d0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
263e0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
263f0 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
26400 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
26410 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
26420 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
26430 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
26440 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
26450 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
26460 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
26470 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
26480 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
26490 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
264a0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
264b0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
264c0 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
264d0 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
264e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
264f0 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
26500 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
26510 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
26520 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
26530 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
26540 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
26550 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
26560 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
26570 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
26580 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
26590 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
265a0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
265b0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
265c0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
265d0 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
265e0 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
265f0 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
26600 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26610 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
26620 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
26630 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
26640 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
26650 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
26660 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
26670 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
26680 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
26690 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
266a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
266b0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
266c0 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
266d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
266e0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
266f0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26710 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
26720 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
26730 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
26740 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
26750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26760 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
26770 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
26780 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
26790 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
267a0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
267b0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
267c0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
267d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
267e0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
267f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
26810 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
26820 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
26830 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
26840 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26850 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
26860 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
26870 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
26880 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
26890 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
268a0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
268b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
268c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
268d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
268e0 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
268f0 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
26900 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
26910 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
26920 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
26930 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
26940 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
26950 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
26960 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
26970 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
26980 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
26990 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
269a0 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
269b0 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
269c0 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
269d0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
269e0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
269f0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
26a00 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
26a10 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
26a20 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
26a30 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
26a40 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
26a50 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
26a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
26a70 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
26a80 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
26a90 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
26aa0 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
26ab0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
26ac0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
26ad0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
26ae0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
26af0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
26b00 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
26b10 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20  erflow pages.** 
26b20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
26b30 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
26b40 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
26b50 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20  populate.** the 
26b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
26b70 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28  st cache array (
26b80 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
26b90 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75  ow). .** Subsequ
26ba0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
26bb0 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  is cache to make
26bc0 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
26bd0 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
26be0 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65  .** more efficie
26bf0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
26c00 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
26c10 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
26c20 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
26c30 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  t must be.** inv
26c40 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
26c50 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
26c60 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
26c70 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
26c80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
26c90 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
26ca0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
26cb0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
26cc0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
26cd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
26ce0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
26cf0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
26d00 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
26d10 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
26d20 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
26d30 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
26d40 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
26d50 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
26d60 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
26d70 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
26d80 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
26d90 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
26da0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
26db0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
26dc0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
26dd0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
26de0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
26df0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
26e00 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
26e10 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
26e20 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
26e30 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
26e40 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
26e50 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
26e60 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
26e70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
26e80 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
26e90 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
26ea0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
26eb0 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
26ec0 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
26ed0 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
26ee0 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
26ef0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
26f00 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
26f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26f20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
26f30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26f40 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20   = pCur->pPage; 
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f60 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
26f70 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
26f80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
26f90 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26fb0 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
26fc0 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
26fd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26fe0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
26ff0 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  EAD.  unsigned c
27000 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66  har * const pBuf
27010 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20  Start = pBuf;   
27020 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72    /* Start of or
27030 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65  iginal out buffe
27040 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  r */.#endif..  a
27050 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
27060 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30    assert( eOp==0
27070 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20   || eOp==1 );.  
27080 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27090 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
270a0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
270b0 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
270c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
270d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
270e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
270f0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
27100 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
27110 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27120 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  oad;.  assert( o
27130 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75  ffset+amt <= pCu
27140 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
27150 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61   );..  assert( a
27160 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d  Payload > pPage-
27170 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20  >aData );.  if( 
27180 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20  (uptr)(aPayload 
27190 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20  - pPage->aData) 
271a0 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  > (pBt->usableSi
271b0 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze - pCur->info.
271c0 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  nLocal) ){.    /
271d0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
271e0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
271f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
27200 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  ta is an error. 
27210 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64   The.    ** cond
27220 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73  itional above is
27230 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20   really:.    ** 
27240 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75     &aPayload[pCu
27250 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
27260 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
27270 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
27280 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72  .    ** but is r
27290 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63  ecast into its c
272a0 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61  urrent form to a
272b0 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65  void integer ove
272c0 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20  rflow problems. 
272d0 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
272e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
272f0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
27300 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
27310 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
27320 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
27330 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
27340 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
27350 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
27360 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
27370 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
27380 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
27390 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
273a0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
273b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
273c0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
273d0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
273e0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
273f0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
27400 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
27410 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
27420 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
27430 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
27440 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
27450 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
27460 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
27470 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
27480 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
27490 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
274a0 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
274b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
274c0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
274d0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
274e0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
274f0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
27500 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
27510 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
27520 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
27530 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
27540 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
27550 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
27560 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
27570 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
27580 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
27590 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
275a0 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e  y is sized at on
275b0 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
275c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
275d0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65     ** in the ove
275e0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
275f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
27600 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
27610 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a  ow page is.    *
27620 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  * stored in aOve
27630 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41  rflow[0], etc. A
27640 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
27650 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
27660 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e  rray.    ** mean
27670 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
27680 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  " (the cache is 
27690 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
276a0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
276b0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
276c0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
276d0 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)==0 ){.      
276e0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
276f0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
27700 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
27710 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
27720 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  vflSize;.      i
27730 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
27740 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ow==0.       || 
27750 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f  nOvfl*(int)sizeo
27760 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65  f(Pgno) > sqlite
27770 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72  3MallocSize(pCur
27780 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20  ->aOverflow).   
27790 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67     ){.        Pg
277a0 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
277b0 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
277c0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
277d0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
277e0 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
277f0 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
27800 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
27810 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27830 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
27840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27850 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
27860 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ow = aNew;.     
27870 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27880 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e     memset(pCur->
27890 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f  aOverflow, 0, nO
278a0 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  vfl*sizeof(Pgno)
278b0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  );.      pCur->c
278c0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
278d0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d  ValidOvfl;.    }
278e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
278f0 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
27900 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
27910 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
27920 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  d and the.      
27930 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
27940 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
27950 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
27960 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
27970 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
27980 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  o it..      */. 
27990 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
279a0 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
279b0 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
279c0 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
279d0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
279e0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
279f0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
27a00 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 20  w[iIdx];.       
27a10 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
27a20 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
27a30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
27a40 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
27a50 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
27a60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 65 78  ;.    while( nex
27a70 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f  tPage ){.      /
27a80 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
27a90 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
27aa0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
27ab0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ache. */.      a
27ac0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76  ssert( pCur->aOv
27ad0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a  erflow[iIdx]==0.
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
27af0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27b00 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
27b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
27b20 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
27b30 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
27b40 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
27b50 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 69  xtPage;..      i
27b60 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
27b70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
27b80 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
27b90 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
27ba0 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
27bb0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
27bc0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
27bd0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
27be0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
27bf0 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
27c00 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
27c10 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
27c20 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
27c30 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
27c40 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
27c50 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
27c60 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
27c70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
27c80 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
27c90 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
27ca0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
27cb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
27cc0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
27cd0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29  BTCF_ValidOvfl )
27ce0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27cf0 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  ( pCur->pBtree->
27d00 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20  db==pBt->db );. 
27d10 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
27d20 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
27d30 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
27d40 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
27d50 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
27d60 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1];.        }els
27d70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
27d80 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
27d90 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
27da0 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
27db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27dc0 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
27dd0 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
27de0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
27df0 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
27e00 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
27e10 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
27e20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
27e30 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
27e40 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
27e50 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
27e60 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
27e70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
27e80 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
27e90 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
27ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27eb0 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 2f 2a  ile *fd;      /*
27ec0 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   File from which
27ed0 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20 6f 76   to do direct ov
27ee0 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f 0a 23  erflow read */.#
27ef0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
27f00 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
27f10 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
27f20 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
27f30 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
27f40 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
27f50 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
27f60 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
27f70 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
27f80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
27f90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
27fa0 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
27fb0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
27fc0 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
27fd0 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
27fe0 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
27ff0 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
28000 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
28010 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
28020 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
28030 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
28040 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
28050 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
28060 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
28070 20 20 20 34 29 20 74 68 65 20 64 61 74 61 62 61     4) the databa
28080 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
28090 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
280a0 2a 20 20 20 35 29 20 74 68 65 20 70 61 67 65 20  *   5) the page 
280b0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41  is not in the WA
280c0 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  L file.        *
280d0 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73 74 20  *   6) at least 
280e0 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
280f0 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
28100 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
28110 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
28120 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
28130 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
28140 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
28150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28160 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
28170 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
28180 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
28190 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
281a0 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
281b0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
281c0 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
281d0 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
281e0 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
281f0 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
28200 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
28210 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20   eOp==0         
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
28250 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
28260 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28290 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
282a0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
282b0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
282c0 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
282d0 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a        /* (3) */.
282e0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
282f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
28300 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
28310 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
28320 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
28330 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 50    && 0==sqlite3P
28340 61 67 65 72 55 73 65 57 61 6c 28 70 42 74 2d 3e  agerUseWal(pBt->
28350 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
28360 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a  )       /* (5) *
28370 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
28380 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
28390 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
283c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
283d0 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
283e0 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
283f0 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
28400 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28410 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
28420 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28440 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20   due to (6) */. 
28450 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
28460 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
28470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
28480 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
28490 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
284a0 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
284b0 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
284c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
284d0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
284e0 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
284f0 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
28500 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
28510 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
28520 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
28530 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
28540 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
28550 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28560 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
28570 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
28580 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
28590 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f         (eOp==0 ?
285a0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
285b0 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
285c0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
285d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
285e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
285f0 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
28600 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
28610 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28620 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
28630 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
28640 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
28650 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
28660 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
28670 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
28680 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
28690 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
286a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
286b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
286c0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
286d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
286e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
286f0 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69   -= a;.        i
28700 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75  f( amt==0 ) retu
28710 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70  rn rc;.        p
28720 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
28730 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
28740 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49   break;.      iI
28750 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dx++;.    }.  }.
28760 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28770 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
28780 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  .    /* Overflow
28790 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d   chain ends prem
287a0 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20 72  aturely */.    r
287b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
287c0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
287d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
287e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
287f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
28800 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
28810 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
28820 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
28830 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
28840 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
28850 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
28860 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
28870 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
28880 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
28890 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
288a0 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
288b0 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
288c0 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
288d0 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
288e0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
288f0 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
28900 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
28910 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
28920 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
28930 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
28940 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
28950 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
28960 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
28970 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
28980 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
28990 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
289a0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
289b0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
289c0 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
289d0 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
289e0 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
289f0 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
28a00 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
28a10 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
28a20 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
28a30 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
28a40 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
28a50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
28a60 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
28a70 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
28a80 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
28a90 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
28aa0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
28ab0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
28ac0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
28ad0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
28ae0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28af0 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
28b00 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28b10 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
28b20 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
28b30 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28b40 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
28b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28b60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28b70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28b80 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28b90 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
28ba0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
28bb0 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
28bc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28bd0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28be0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28bf0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
28c00 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
28c10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
28c20 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
28c30 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
28c40 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  ) works even if 
28c50 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
28c60 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52  ot.** in the CUR
28c70 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e  SOR_VALID state.
28c80 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65    It is only use
28c90 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
28ca0 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20  _blob_read().** 
28cb0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
28cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28cd0 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69  T_INCRBLOB.stati
28ce0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
28cf0 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  E int accessPayl
28d00 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74  oadChecked(.  Bt
28d10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  Cursor *pCur,.  
28d20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33  u32 offset,.  u3
28d30 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70  2 amt,.  void *p
28d40 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Buf.){.  int rc;
28d50 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
28d60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
28d70 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
28d80 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
28d90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
28da0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28db0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
28dc0 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
28dd0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
28de0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  r);.  return rc 
28df0 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79  ? rc : accessPay
28e00 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
28e10 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
28e20 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
28e30 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
28e40 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
28e50 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
28e60 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
28e70 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  uf){.  if( pCur-
28e80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28e90 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
28ea0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
28eb0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
28ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
28ed0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
28ee0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
28ef0 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f, 0);.  }else{.
28f00 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
28f10 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
28f20 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
28f30 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  t, pBuf);.  }.}.
28f40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
28f50 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
28f60 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
28f70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
28f80 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
28f90 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
28fa0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
28fb0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
28fc0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
28fd0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
28fe0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
28ff0 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
29000 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
29010 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
29020 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
29030 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
29040 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
29050 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
29060 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
29070 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
29080 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29090 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
290a0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
290b0 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
290c0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
290d0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
290e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
290f0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
29100 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
29110 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
29120 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
29130 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
29140 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
29150 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
29160 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
29170 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
29180 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
29190 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
291a0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
291b0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
291c0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
291d0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
291e0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
291f0 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
29200 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
29210 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
29220 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
29230 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
29240 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
29250 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
29260 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
29270 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
29280 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
29290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
292a0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
292b0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
292c0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
292d0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
292e0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
292f0 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
29300 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
29310 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
29320 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
29330 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
29340 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
29350 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
29360 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
29370 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
29380 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
29390 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
293a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
293b0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
293c0 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
293d0 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  ){.  int amt;.  
293e0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
293f0 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
29400 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
29410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29420 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29430 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
29440 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
29450 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
29460 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
29470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
29480 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29490 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
294a0 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
294b0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
294c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
294d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
294e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
294f0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
29500 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  >pCur->pPage->aD
29510 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
29520 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
29530 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29540 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad<pCur->pPage->
29550 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
29560 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
29570 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
29580 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e  l;.  if( amt>(in
29590 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
295a0 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
295b0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20  >info.pPayload) 
295c0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
295d0 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70  is too little sp
295e0 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
295f0 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65 64  for the expected
29600 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f   amount.    ** o
29610 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e  f local content.
29620 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   Database must b
29630 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
29640 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
29650 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20  T_DB );.    amt 
29660 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70  = MAX(0, (int)(p
29670 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
29680 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
29690 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20  o.pPayload));.  
296a0 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32  }.  *pAmt = (u32
296b0 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  )amt;.  return (
296c0 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
296d0 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
296e0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
296f0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
29700 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
29710 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
29720 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
29730 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
29740 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
29750 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
29760 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
29770 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
29780 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
29790 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
297a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
297b0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
297c0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
297d0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
297e0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
297f0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
29800 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
29810 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
29820 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
29830 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
29840 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
29850 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
29860 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
29870 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
29880 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
29890 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
298a0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
298b0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
298c0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
298d0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
298e0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
298f0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
29900 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
29910 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
29920 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
29930 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
29940 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
29950 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
29960 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
29970 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
29980 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
29990 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
299a0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
299b0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
299c0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
299d0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
299e0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
299f0 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
29a00 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
29a10 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
29a20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
29a30 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
29a40 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
29a50 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
29a60 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
29a70 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
29a80 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
29a90 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
29aa0 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
29ab0 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
29ac0 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
29ad0 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
29ae0 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
29af0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
29b00 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
29b10 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
29b20 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
29b30 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
29b40 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
29b50 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29b60 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29b70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29b80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29b90 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29ba0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
29bb0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
29bc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29bd0 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
29be0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
29bf0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
29c00 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
29c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29c20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
29c30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
29c40 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
29c50 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
29c60 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
29c70 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
29c80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29c90 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69  iPage] = pCur->i
29ca0 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  x;.  pCur->apPag
29cb0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  e[pCur->iPage] =
29cc0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
29cd0 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
29ce0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20  pCur->iPage++;. 
29cf0 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
29d00 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
29d10 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  gno, &pCur->pPag
29d20 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63  e, pCur, pCur->c
29d30 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
29d40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29d50 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
29d60 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
29d70 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
29d80 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
29d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
29da0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
29db0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
29dc0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
29dd0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
29de0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
29df0 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
29e00 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
29e10 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
29e20 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
29e30 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
29e40 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
29e50 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
29e60 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
29e70 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
29e80 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
29e90 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
29ea0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
29eb0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
29ec0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
29ed0 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
29ee0 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
29ef0 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
29f00 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
29f30 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
29f40 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
29f50 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
29f60 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
29f70 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
29f80 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
29f90 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
29fa0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
29fb0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
29fc0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
29fd0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
29fe0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
29ff0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
2a000 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
2a010 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
2a020 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
2a030 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
2a040 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
2a050 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
2a060 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2a070 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
2a080 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
2a090 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
2a0a0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
2a0b0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
2a0c0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
2a0d0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
2a0e0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2a0f0 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
2a100 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
2a110 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
2a120 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
2a130 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
2a140 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
2a150 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
2a160 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
2a170 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2a180 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a 20  emPage *pLeaf;. 
2a190 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a1a0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a1b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2a1c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a1d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2a1e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2a1f0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
2a200 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  ( pCur->pPage );
2a210 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
2a220 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
2a230 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a240 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
2a250 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a260 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
2a270 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  r->pPage->pgno. 
2a280 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2a290 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a2a0 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
2a2b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a2c0 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
2a2d0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2a2e0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a2f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a300 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2a310 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2a320 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43  .  pCur->ix = pC
2a330 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a340 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65 61  iPage-1];.  pLea
2a350 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  f = pCur->pPage;
2a360 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
2a370 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d 2d   pCur->apPage[--
2a380 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2a390 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2a3a0 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a  ll(pLeaf);.}../*
2a3b0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a3c0 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
2a3d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2a3e0 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
2a3f0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
2a400 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
2a410 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2a420 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
2a430 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
2a440 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
2a450 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2a460 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
2a470 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2a480 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
2a490 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
2a4a0 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
2a4b0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
2a4c0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
2a4d0 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
2a4e0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
2a4f0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2a500 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
2a510 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
2a520 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
2a530 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2a540 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
2a550 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
2a560 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
2a570 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20 74 68  R_INVALID and th
2a580 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2a590 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e  ns SQLITE_EMPTY.
2a5a0 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
2a5b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
2a5c0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2a5d0 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63 61   first cell loca
2a5e0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 0a  ted on the root.
2a5f0 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ** (or virtual r
2a600 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
2a610 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2a620 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
2a630 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
2a640 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2a650 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
2a660 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
2a670 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
2a680 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
2a690 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
2a6a0 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
2a6b0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
2a6c0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
2a6d0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
2a6e0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
2a6f0 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
2a700 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
2a710 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
2a720 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
2a730 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
2a740 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
2a750 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
2a760 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
2a770 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
2a780 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
2a790 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
2a7a0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
2a7b0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2a7c0 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
2a7d0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
2a7e0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
2a7f0 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
2a800 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
2a810 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a820 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
2a830 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2a840 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2a850 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a860 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a870 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2a880 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
2a890 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2a8a0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2a8b0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
2a8c0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2a8d0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2a8e0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
2a8f0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2a900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a910 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52 53 4f  ->eState < CURSO
2a920 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 7c 7c  R_REQUIRESEEK ||
2a930 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29   pCur->iPage<0 )
2a940 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a950 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20  ->pgnoRoot>0 || 
2a960 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b  pCur->iPage<0 );
2a970 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
2a980 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  age>=0 ){.    if
2a990 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b  ( pCur->iPage ){
2a9a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2a9b0 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2a9c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 77 68  pPage);.      wh
2a9d0 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50 61  ile( --pCur->iPa
2a9e0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ge ){.        re
2a9f0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2aa00 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
2aa10 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 20  ur->iPage]);.   
2aa20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2aa30 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
2aa40 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20 20  pPage[0];.      
2aa50 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
2aa60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2aa70 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2aa80 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
2aa90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2aaa0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
2aab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54  turn SQLITE_EMPT
2aac0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
2aad0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2aae0 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
2aaf0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ab00 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2ab10 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20 20 69  ESEEK ){.      i
2ab20 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2ab30 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2ab40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ab50 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
2ab60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2ab70 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
2ab80 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
2ab90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2aba0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
2abb0 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  or(pCur);.    }.
2abc0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
2abd0 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
2abe0 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
2abf0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
2ac00 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20  ->pPage,.       
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67   0, pCur->curPag
2ac30 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  erFlags);.    if
2ac40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ac50 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
2ac60 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2ac70 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
2ac80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2ac90 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
2aca0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
2acb0 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
2acc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20  pPage->intKey;. 
2acd0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
2ace0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
2acf0 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
2ad00 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
2ad10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
2ad20 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
2ad30 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
2ad40 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
2ad50 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
2ad60 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
2ad70 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
2ad80 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
2ad90 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
2ada0 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
2adb0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
2adc0 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
2add0 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
2ade0 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
2adf0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
2ae00 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
2ae10 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
2ae20 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
2ae30 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
2ae40 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
2ae50 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
2ae60 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
2ae70 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
2ae80 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
2ae90 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
2aea0 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
2aeb0 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
2aec0 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
2aed0 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
2aee0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2aef0 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
2af00 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
2af10 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
2af20 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
2af30 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
2af40 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
2af50 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
2af60 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
2af70 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
2af80 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
2af90 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
2afa0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
2afb0 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
2afc0 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
2afd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2afe0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43 75 72  ORRUPT_PAGE(pCur
2aff0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 73  ->pPage);.  }..s
2b000 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43  kip_init:  .  pC
2b010 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43  ur->ix = 0;.  pC
2b020 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2b030 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2b040 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2b050 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2b060 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2b070 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d  vfl);..  pRoot =
2b080 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2b090 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
2b0a0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
2b0b0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2b0c0 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
2b0d0 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
2b0e0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
2b0f0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
2b100 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
2b110 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2b120 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
2b130 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
2b140 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
2b150 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
2b160 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
2b170 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2b180 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
2b190 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2b1a0 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
2b1b0 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
2b1c0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2b1d0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
2b1e0 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
2b1f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b200 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2b210 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2b220 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
2b230 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2b240 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
2b250 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2b260 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2b270 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
2b280 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
2b290 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
2b2a0 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
2b2b0 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
2b2c0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2b2d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2b2e0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
2b2f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
2b300 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
2b310 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b320 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2b330 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2b340 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b350 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b360 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b370 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b380 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2b390 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
2b3a0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2b3b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
2b3c0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2b3d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2b3e0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2b3f0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2b400 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20  e, pCur->ix));. 
2b410 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b420 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2b430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2b450 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2b460 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
2b470 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2b480 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
2b490 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2b4a0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2b4b0 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
2b4c0 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
2b4d0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
2b4e0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
2b4f0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
2b500 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
2b510 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
2b520 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2b530 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
2b540 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
2b550 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
2b560 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
2b570 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2b580 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
2b590 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
2b5a0 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
2b5b0 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
2b5c0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
2b5d0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
2b5e0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2b5f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2b600 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
2b610 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
2b620 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
2b630 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b640 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2b650 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2b660 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2b670 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2b680 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b690 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b6a0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
2b6b0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2b6c0 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
2b6d0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2b6e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2b6f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2b700 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2b710 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2b720 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
2b730 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2b740 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2b750 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2b760 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50  .  pCur->ix = pP
2b770 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2b780 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2b790 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2b7a0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2b7b0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2b7c0 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
2b7d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b7e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
2b7f0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2b800 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2b810 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2b820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2b830 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2b840 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2b850 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2b860 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2b870 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2b880 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2b890 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2b8a0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2b8b0 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
2b8c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2b8d0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2b8e0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2b8f0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b900 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b920 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2b930 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2b940 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
2b950 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2b960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b970 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b980 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2b990 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  l>0 );.    *pRes
2b9a0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
2b9b0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2b9c0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ur);.  }else if(
2b9d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2b9e0 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
2b9f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2ba00 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2ba10 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2ba20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2ba30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2ba40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ba50 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2ba60 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2ba70 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2ba80 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2ba90 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
2baa0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
2bab0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
2bac0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
2bad0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
2bae0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
2baf0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
2bb00 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2bb10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2bb20 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
2bb30 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2bb40 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2bb50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2bb60 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2bb70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2bb80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2bb90 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2bba0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2bbb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2bbc0 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
2bbd0 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
2bbe0 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
2bbf0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
2bc00 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2bc10 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70  ur->eState && (p
2bc20 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2bc30 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2bc40 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2bc50 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
2bc60 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
2bc70 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
2bc80 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
2bc90 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
2bca0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
2bcb0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
2bcc0 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
2bcd0 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
2bce0 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
2bcf0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
2bd00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2bd10 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
2bd20 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
2bd30 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
2bd40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d  ssert( pCur->ix=
2bd50 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  =pCur->pPage->nC
2bd60 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
2bd70 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2bd80 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
2bd90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2bda0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
2bdb0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2bdc0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2bdd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bde0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2bdf0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2be00 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ID );.    *pRes 
2be10 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
2be20 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2be30 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ur);.    if( rc=
2be40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2be50 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2be60 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73  gs |= BTCF_AtLas
2be70 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2be80 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2be90 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2bea0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  st;.    }.  }els
2beb0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2bec0 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73  _EMPTY ){.    as
2bed0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2bee0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2bef0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
2bf00 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
2bf10 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
2bf20 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
2bf30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
2bf40 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
2bf50 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2bf60 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
2bf70 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
2bf80 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
2bf90 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
2bfa0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
2bfb0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
2bfc0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
2bfd0 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
2bfe0 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
2bff0 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
2c000 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
2c010 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
2c020 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
2c030 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
2c040 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
2c050 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
2c060 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
2c070 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2c080 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
2c090 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
2c0a0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
2c0b0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
2c0c0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
2c0d0 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
2c0e0 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
2c0f0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
2c100 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
2c110 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
2c120 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
2c130 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
2c140 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
2c150 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
2c160 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
2c170 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
2c180 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
2c190 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
2c1a0 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
2c1b0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
2c1c0 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
2c1d0 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
2c1e0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2c1f0 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
2c200 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2c210 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2c220 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
2c250 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2c260 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
2c270 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
2c290 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
2c2a0 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
2c2b0 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
2c2c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2c2d0 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
2c2e0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2c2f0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2c300 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2c310 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
2c320 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
2c330 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
2c340 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
2c350 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2c360 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2c370 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c390 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2c3a0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2c3b0 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20  **.** For index 
2c3c0 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78  tables, the pIdx
2c3d0 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c  Key->eqSeen fiel
2c3e0 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66  d is set to 1 if
2c3f0 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73   there.** exists
2c400 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2c410 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63   table that exac
2c420 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78  tly matches pIdx
2c430 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  Key.  .*/.int sq
2c440 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2c450 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
2c460 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2c470 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
2c480 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
2c490 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
2c4a0 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
2c4b0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
2c4c0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
2c4d0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
2c4e0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
2c4f0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
2c500 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
2c510 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
2c520 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
2c530 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
2c540 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
2c550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2c560 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
2c570 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
2c580 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
2c590 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
2c5a0 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
2c5b0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2c5c0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2c5d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c5e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2c5f0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2c600 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2c610 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
2c620 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
2c630 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
2c640 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
2c650 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2c660 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2c670 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2c680 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d  Cur->curIntKey!=
2c690 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
2c6a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
2c6b0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
2c6c0 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
2c6d0 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
2c6e0 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
2c6f0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
2c700 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
2c710 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  ork */.  if( pId
2c720 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43  xKey==0.   && pC
2c730 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2c740 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
2c750 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2c760 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
2c770 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
2c780 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2c790 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2c7a0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2c7b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c7c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c7d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
2c7e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2c7f0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
2c800 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2c810 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
2c820 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2c830 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c840 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2c850 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
2c860 65 71 75 65 73 74 65 64 20 6b 65 79 20 69 73 20  equested key is 
2c870 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
2c880 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20  e previous key, 
2c890 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72  then.      ** tr
2c8a0 79 20 74 6f 20 67 65 74 20 74 68 65 72 65 20 75  y to get there u
2c8b0 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65  sing sqlite3Btre
2c8c0 65 4e 65 78 74 28 29 20 72 61 74 68 65 72 20 74  eNext() rather t
2c8d0 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20  han a full.     
2c8e0 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63   ** binary searc
2c8f0 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  h.  This is an o
2c900 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
2c910 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61  .  The correct a
2c920 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  nswer.      ** i
2c930 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64  s still obtained
2c940 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 63 61   without this ca
2c950 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c  se, only a littl
2c960 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a  e more slowely *
2c970 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
2c980 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69  ->info.nKey+1==i
2c990 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d 3e  ntKey && !pCur->
2c9a0 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2c9b0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2c9c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c9d0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
2c9e0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
2c9f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ca00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
2ca10 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
2ca20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ca30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2ca40 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2ca50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ca60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2ca70 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2ca80 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2ca90 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
2caa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2cab0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
2cac0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2cad0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2cae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2caf0 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
2cb00 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
2cb10 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
2cb20 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
2cb30 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
2cb40 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2cb50 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2cb60 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2cb70 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
2cb80 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2cb90 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
2cba0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2cbb0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
2cbc0 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
2cbd0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2cbe0 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
2cbf0 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
2cc00 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
2cc10 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2cc20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2cc30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cc40 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20  E_EMPTY ){.     
2cc50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2cc60 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2cc70 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2cc80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
2cc90 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
2cca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ccb0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2ccc0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2ccd0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
2cce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ccf0 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
2cd00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cd10 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2cd20 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2cd30 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2cd40 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a  e->nCell > 0 );.
2cd50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cd60 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72  iPage==0 || pCur
2cd70 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2cd80 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key==pCur->curIn
2cd90 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  tKey );.  assert
2cda0 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
2cdb0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
2cdc0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
2cdd0 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
2cde0 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
2cdf0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
2ce00 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2ce10 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a  >pPage;.    u8 *
2ce20 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2ce50 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2ce60 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2ce70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2ce80 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2ce90 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2cea0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2ceb0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2cec0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2ced0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2cee0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2cef0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2cf00 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2cf10 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2cf20 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2cf30 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2cf40 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2cf50 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2cf60 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2cf70 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2cf80 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2cf90 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2cfa0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2cfb0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2cfc0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2cfd0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2cfe0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2cff0 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2d000 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2d010 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2d020 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d030 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2d040 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d050 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2d060 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2d070 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2d080 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2d090 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2d0a0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2d0b0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2d0c0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2d0d0 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2d0e0 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2d0f0 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2d100 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   */.    pCur->ix
2d110 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2d120 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2d130 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2d140 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2d150 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2d160 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2d170 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2d180 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2d190 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2d1a0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2d1b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2d1c0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2d1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d1e0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2d1f0 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20  ->aDataEnd ){.  
2d200 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2d210 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2d220 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
2d230 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2d240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d250 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2d260 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2d270 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2d280 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2d290 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2d2a0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2d2b0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2d2c0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2d2d0 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2d2e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d2f0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2d300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2d310 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2d320 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2d330 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2d340 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2d350 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2d360 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2d370 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2d380 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2d390 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2d3a0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d3b0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2d3c0 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
2d3d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2d3e0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
2d3f0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2d400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2d410 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2d420 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
2d430 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2d440 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
2d450 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2d460 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
2d470 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
2d480 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2d490 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2d4a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d4b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d4c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2d4d0 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2d4e0 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2d4f0 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2d500 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2d510 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
2d520 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d530 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2d540 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f     int nCell;  /
2d550 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43  * Size of the pC
2d560 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65  ell cell in byte
2d570 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65  s */.        pCe
2d580 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2d590 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2d5a0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
2d5b0 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
2d5c0 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
2d5d0 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
2d5e0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
2d5f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
2d600 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
2d610 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
2d620 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
2d630 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
2d640 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
2d650 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
2d660 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
2d670 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
2d680 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
2d690 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
2d6a0 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
2d6b0 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
2d6c0 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
2d6d0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2d6e0 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
2d6f0 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
2d700 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
2d710 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2d720 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
2d730 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
2d740 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
2d750 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
2d760 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
2d770 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
2d780 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43     */.        nC
2d790 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
2d7a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2d7b0 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
2d7c0 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  tePayload ){.   
2d7d0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2d7e0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
2d7f0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2d800 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
2d810 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
2d820 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
2d830 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2d840 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
2d850 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
2d860 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
2d870 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2d880 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d890 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70  pCell+nCell+1==p
2d8a0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2d8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2d8c0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2d8d0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2d8e0 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
2d8f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2d900 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
2d910 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
2d920 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
2d930 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
2d940 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
2d950 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
2d960 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d970 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
2d980 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
2d990 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
2d9a0 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
2d9b0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
2d9c0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2d9d0 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
2d9e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2d9f0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2da00 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
2da10 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2da20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2da30 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2da40 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
2da50 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2da60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2da70 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2da80 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
2da90 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
2daa0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
2dab0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
2dac0 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
2dad0 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
2dae0 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
2daf0 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
2db00 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2db10 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2db20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
2db30 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
2db40 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
2db50 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
2db60 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
2db70 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
2db80 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  d. .          **
2db90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
2dba0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
2dbb0 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63  orrupt, the xRec
2dbc0 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69  ordCompare routi
2dbd0 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20  ne may read.    
2dbe0 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74        ** up to t
2dbf0 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20  wo varints past 
2dc00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2dc10 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20  uffer. An extra 
2dc20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  18 .          **
2dc30 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
2dc40 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  g is allocated a
2dc50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2dc60 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20   buffer in.     
2dc70 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69       ** case thi
2dc80 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20  s happens.  */. 
2dc90 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
2dca0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2dcb0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
2dcc0 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
2dcd0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
2dce0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2dcf0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
2dd00 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  ll(pPage, pCellB
2dd10 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
2dd20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
2dd30 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
2dd40 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
2dd50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2dd60 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54  Cell<0 );   /* T
2dd70 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20  rue if key size 
2dd80 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20  is 2^32 or more 
2dd90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2dda0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20  tcase( nCell==0 
2ddb0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2ddc0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2ddd0 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20  x80 0x00 */.    
2dde0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ddf0 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20  nCell==1 );  /* 
2de00 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2de10 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2de20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  1 */.          t
2de30 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2de40 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  2 );  /* Minimum
2de50 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79   legal index key
2de60 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20   size */.       
2de70 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29     if( nCell<2 )
2de80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2de90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2dea0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
2deb0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2dec0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2ded0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dee0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
2def0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
2df00 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20  Cell+18 );.     
2df10 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2df20 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2df30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2df40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2df50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2df60 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2df70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2df80 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2df90 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2dfa0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
2dfb0 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
2dfc0 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
2dfd0 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29  ar*)pCellKey, 0)
2dfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2dff0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
2e000 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
2e010 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2e020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2e030 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2e040 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
2e050 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2e060 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2e070 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
2e080 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2e090 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
2e0a0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2e0b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2e0c0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2e0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2e0e0 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20  ssert( .        
2e0f0 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72      (pIdxKey->er
2e100 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f  rCode!=SQLITE_CO
2e110 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20  RRUPT || c==0). 
2e120 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78          && (pIdx
2e130 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2e140 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43  LITE_NOMEM || pC
2e150 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2e160 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20  mallocFailed).  
2e170 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2e180 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
2e190 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2e1a0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2e1b0 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
2e1c0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2e1d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2e1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2e1f0 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
2e200 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2e210 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2e220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e230 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2e240 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2e250 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
2e260 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20  >errCode ) rc = 
2e270 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e280 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
2e290 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2e2a0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
2e2b0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2e2c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2e2d0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2e2e0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2e2f0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2e300 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2e310 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
2e320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2e330 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
2e340 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
2e350 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2e360 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
2e370 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2e380 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
2e390 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e3a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e3b0 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ix<pCur->pPage->
2e3c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  nCell );.      p
2e3d0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2e3e0 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  dx;.      *pRes 
2e3f0 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
2e400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e410 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2e420 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74  ish;.    }.movet
2e430 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20  o_next_layer:.  
2e440 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65    if( lwr>=pPage
2e450 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
2e460 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2e470 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2e480 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2e490 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
2e4a0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2e4b0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2e4c0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
2e4d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2e4e0 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a  >ix = (u16)lwr;.
2e4f0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2e500 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
2e510 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
2e520 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65   break;.  }.move
2e530 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75  to_finish:.  pCu
2e540 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2e550 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  0;.  assert( (pC
2e560 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2e570 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2e580 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
2e590 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2e5a0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
2e5b0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2e5c0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2e5d0 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
2e5e0 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
2e5f0 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
2e600 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
2e610 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
2e620 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
2e630 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2e640 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
2e650 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
2e660 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
2e670 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
2e680 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
2e690 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
2e6a0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2e6b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
2e6c0 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
2e6d0 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2e6e0 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
2e6f0 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
2e700 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
2e710 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
2e720 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2e730 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
2e740 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
2e750 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
2e760 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
2e770 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
2e780 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
2e790 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
2e7a0 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
2e7b0 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
2e7c0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2e7d0 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20  urn an estimate 
2e7e0 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
2e7f0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2e800 62 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ble that pCur is
2e810 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  .** pointing to.
2e820 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2e830 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f  ive number if no
2e840 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72   estimate is cur
2e850 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c  rently .** avail
2e860 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  able..*/.i64 sql
2e870 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e  ite3BtreeRowCoun
2e880 74 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  tEst(BtCursor *p
2e890 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  Cur){.  i64 n;. 
2e8a0 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74   u8 i;..  assert
2e8b0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2e8c0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2e8d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e8e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2e8f0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2e900 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72  ex) );..  /* Cur
2e910 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65  rently this inte
2e920 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61  rface is only ca
2e930 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49  lled by the OP_I
2e940 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70  fSmaller.  ** op
2e950 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61  code, and it tha
2e960 74 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f  t case the curso
2e970 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  r will always be
2e980 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20   valid and.  ** 
2e990 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e  will always poin
2e9a0 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65  t to a leaf node
2e9b0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2e9c0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43  (pCur->eState!=C
2e9d0 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72  URSOR_VALID) ) r
2e9e0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20  eturn -1;.  if( 
2e9f0 4e 45 56 45 52 28 70 43 75 72 2d 3e 70 50 61 67  NEVER(pCur->pPag
2ea00 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65  e->leaf==0) ) re
2ea10 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20  turn -1;..  n = 
2ea20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2ea30 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ll;.  for(i=0; i
2ea40 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  <pCur->iPage; i+
2ea50 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75  +){.    n *= pCu
2ea60 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43  r->apPage[i]->nC
2ea70 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ell;.  }.  retur
2ea80 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n n;.}../*.** Ad
2ea90 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
2eaa0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
2eab0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2eac0 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76  se. .** Return v
2ead0 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  alue:.**.**    S
2eae0 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
2eaf0 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51  success.**    SQ
2eb00 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63  LITE_DONE      c
2eb10 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2eb20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
2eb30 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a   last element.**
2eb40 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
2eb50 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f       some kind o
2eb60 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  f error occurred
2eb70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2eb80 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2eb90 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2eba0 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2ebb0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2ebc0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2ebd0 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
2ebe0 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2ebf0 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2ec00 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2ec10 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
2ec20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2ec30 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2ec40 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
2ec50 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
2ec60 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2ec70 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2ec80 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2ec90 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
2eca0 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
2ecb0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
2ecc0 66 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68  f bit 0x01 of th
2ecd0 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 6e 20  e F argument in 
2ece0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2ecf0 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e  (C,F) is 1, then
2ed00 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
2ed10 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2ed20 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74   SQL index and t
2ed30 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2ed40 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73  d have been.** s
2ed50 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51  kipped if the SQ
2ed60 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
2ed70 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e   a unique index.
2ed80 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74    The F argument
2ed90 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74 20 74 6f  .** is a hint to
2eda0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20   the implement. 
2edb0 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2edc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2edd0 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69  s not use.** thi
2ede0 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44  s hint, but COMD
2edf0 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74  B2 does..*/.stat
2ee00 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2ee10 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74  NE int btreeNext
2ee20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ee30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2ee40 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2ee50 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2ee60 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ee70 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ee80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ee90 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2eea0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2eeb0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69  SOR_VALID );.  i
2eec0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2eed0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2eee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2eef0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2ef00 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2ef10 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  0 );.    rc = re
2ef20 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2ef30 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2ef40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ef50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ef60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2ef70 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2ef80 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2ef90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2efa0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2efb0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2efc0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2efd0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2efe0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2eff0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2f000 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2f010 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2f020 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f030 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2f040 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2f050 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pNext>0 ){.     
2f060 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2f070 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2f080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2f0a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2f0b0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2f0c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2f0d0 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  age;.  idx = ++p
2f0e0 43 75 72 2d 3e 69 78 3b 0a 20 20 61 73 73 65 72  Cur->ix;.  asser
2f0f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2f100 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2f110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f120 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2f130 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2f140 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2f150 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2f160 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2f170 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2f180 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2f190 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2f1a0 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2f1b0 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2f1c0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2f1d0 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2f1e0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2f1f0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2f200 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2f210 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2f220 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2f230 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2f240 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2f250 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2f260 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2f270 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2f280 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2f290 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2f2a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2f2b0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2f2c0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2f2d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2f2e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2f2f0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2f300 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2f310 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2f320 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2f330 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2f340 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2f350 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2f360 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2f370 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2f380 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2f390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
2f3a0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
2f3b0 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2f3c0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
2f3d0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2f3e0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2f3f0 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e  ur->ix>=pPage->n
2f400 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2f410 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2f420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2f430 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2f440 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
2f450 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2f460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f470 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
2f480 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2f490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f4a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2f4b0 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2f4c0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2f4d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2f4e0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2f4f0 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  pCur, int flags)
2f500 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2f510 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ge;.  UNUSED_PAR
2f520 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b  AMETER( flags );
2f530 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d    /* Used in COM
2f540 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69  DB2 but not nati
2f550 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61  ve SQLite */.  a
2f560 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2f570 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2f580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
2f590 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
2f5a0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2f5b0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2f5c0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2f5d0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2f5e0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2f5f0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2f600 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2f610 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2f620 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2f630 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f640 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f650 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
2f660 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ext(pCur);.  pPa
2f670 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2f680 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
2f690 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >ix)>=pPage->nCe
2f6a0 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
2f6b0 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  ix--;.    return
2f6c0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
2f6d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
2f6e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2f6f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2f710 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2f720 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2f730 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
2f740 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
2f750 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
2f760 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
2f770 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65   database..** Re
2f780 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a  turn values:.**.
2f790 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  **     SQLITE_OK
2f7a0 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20       success.** 
2f7b0 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20      SQLITE_DONE 
2f7c0 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20    the cursor is 
2f7d0 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66  already on the f
2f7e0 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
2f7f0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
2f800 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 73   otherwise     s
2f810 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  ome kind of erro
2f820 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a  r occurred.**.**
2f830 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2f840 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2f850 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
2f860 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2f870 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2f880 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2f890 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63  se of merely dec
2f8a0 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2f8b0 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2f8c0 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2f8d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c  the previous cel
2f8e0 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2f8f0 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2f900 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f  wer) btreePrevio
2f910 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72  us().** helper r
2f920 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f930 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2f940 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2f950 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2f960 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f  e.** or to resto
2f970 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2f980 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31  *.** If bit 0x01
2f990 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65   of the F argume
2f9a0 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  nt to sqlite3Btr
2f9b0 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29 20  eePrevious(C,F) 
2f9c0 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  is 1, then.** th
2f9d0 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70  e cursor corresp
2f9e0 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2f9f0 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2fa00 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2fa10 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64   been.** skipped
2fa20 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65   if the SQL inde
2fa30 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  x had been a uni
2fa40 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2fa50 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a  F argument is a.
2fa60 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69  ** hint to the i
2fa70 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e  mplement.  The n
2fa80 61 74 69 76 65 20 53 51 4c 69 74 65 20 62 74 72  ative SQLite btr
2fa90 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2faa0 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73  n does not.** us
2fab0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  e this hint, but
2fac0 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
2fad0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2fae0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2faf0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2fb00 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2fb10 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2fb20 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2fb30 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2fb40 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2fb50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2fb60 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2fb70 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2fb80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2fb90 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2fba0 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c  lags & (BTCF_AtL
2fbb0 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2fbc0 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2fbd0 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  y))==0 );.  asse
2fbe0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2fbf0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Size==0 );.  if(
2fc00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2fc10 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2fc20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2fc30 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2fc40 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2fc50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fc60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fc70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2fc80 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2fc90 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2fca0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fcb0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20  _DONE;.    }.   
2fcc0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2fcd0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2fce0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2fcf0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2fd00 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2fd10 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2fd20 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2fd30 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2fd40 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2fd50 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c   pCur->skipNext<
2fd60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2fd70 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2fd80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fd90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2fda0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2fdb0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2fdc0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2fdd0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2fde0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2fdf0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
2fe00 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2fe10 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
2fe20 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d  ur->ix;.    rc =
2fe30 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2fe40 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
2fe50 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
2fe60 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
2fe70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fe80 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2fe90 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
2fea0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
2feb0 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20  pCur->ix==0 ){. 
2fec0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2fed0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2fee0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2fef0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2ff00 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ff10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2ff20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2ff30 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2ff40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2ff50 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2ff60 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
2ff70 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2ff80 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
2ff90 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
2ffa0 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a      pCur->ix--;.
2ffb0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2ffc0 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28  ->pPage;.    if(
2ffd0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
2ffe0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
2fff0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
30000 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
30010 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  s(pCur, 0);.    
30020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
30030 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30040 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
30050 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
30060 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
30070 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30080 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
30090 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
300a0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
300b0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
300c0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20  ==0 || flags==1 
300d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
300e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
300f0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
30100 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
30110 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30120 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
30130 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
30140 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
30150 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d  QLite */.  pCur-
30160 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
30170 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
30180 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
30190 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75  alidNKey);.  pCu
301a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
301b0 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
301c0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
301d0 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  LID.   || pCur->
301e0 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72  ix==0.   || pCur
301f0 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ->pPage->leaf==0
30200 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
30210 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
30220 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Cur);.  }.  pCur
30230 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  ->ix--;.  return
30240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
30250 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
30260 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
30270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
30290 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
302a0 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
302b0 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
302c0 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
302d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
302e0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
302f0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
30300 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
30310 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
30320 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
30330 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
30340 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
30350 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
30360 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
30370 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
30380 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
30390 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
303a0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
303b0 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
303c0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
303d0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
303e0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
303f0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
30400 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
30410 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  n error..**.** I
30420 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
30430 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
30440 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
30450 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
30460 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
30470 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
30480 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
30490 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
304a0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
304b0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
304c0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
304d0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
304e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
304f0 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
30500 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
30510 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
30520 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
30530 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
30540 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
30550 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
30560 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
30570 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
30580 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
30590 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
305a0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
305b0 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
305c0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
305d0 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
305e0 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
305f0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
30600 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
30610 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
30620 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
30630 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
30640 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
30650 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
30660 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
30670 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
30680 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
30690 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
306a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
306b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
306c0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
306d0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
306e0 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
306f0 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
30700 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
30710 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
30720 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
30730 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
30740 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
30750 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
30760 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
30770 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
30780 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
30790 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
307a0 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
307b0 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
307c0 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
307d0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
307e0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
307f0 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
30800 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30810 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
30820 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
30830 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
30840 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
30850 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
30860 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
30870 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
30880 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
30890 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
308a0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
308b0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
308c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
308d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
308e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
308f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
30900 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
30910 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
30920 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
30930 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
30940 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
30950 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
30960 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
30970 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
30980 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
30990 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
309a0 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
309b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
309c0 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
309d0 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
309e0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
309f0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
30a00 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
30a10 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
30a20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
30a30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
30a40 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
30a50 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
30a60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30a70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30a80 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
30a90 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
30aa0 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
30ab0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
30ac0 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
30ad0 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
30ae0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
30af0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
30b00 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
30b10 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
30b20 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
30b30 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65  ' */.    u32 nSe
30b40 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43  arch = 0;   /* C
30b50 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
30b60 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74  er of search att
30b70 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20  empts */.    .  
30b80 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
30b90 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
30ba0 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
30bb0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
30bc0 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
30bd0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
30be0 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
30bf0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
30c00 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
30c10 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
30c20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
30c30 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
30c40 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
30c50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30c60 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
30c70 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
30c80 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
30c90 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
30ca0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
30cb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
30cc0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
30cd0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
30ce0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
30cf0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
30d00 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
30d10 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
30d20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
30d30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30d40 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
30d50 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
30d60 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
30d70 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
30d80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30d90 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
30da0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
30db0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30dc0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
30dd0 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
30de0 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
30df0 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
30e00 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
30e10 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
30e20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
30e30 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
30e40 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
30e50 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
30e60 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
30e70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
30e80 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
30e90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
30ea0 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
30eb0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
30ec0 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
30ed0 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
30ee0 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
30ef0 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
30f00 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
30f10 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
30f20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
30f30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
30f40 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
30f50 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
30f60 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
30f70 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
30f80 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
30f90 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
30fa0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
30fb0 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
30fc0 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
30fd0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
30fe0 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
30ff0 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
31000 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
31010 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
31020 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
31030 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
31040 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
31050 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35  OF: R-01506-1105
31060 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  3 The first inte
31070 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
31080 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
31090 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70       ** is the p
310a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
310b0 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20  e next freelist 
310c0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
310d0 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20  e list or.      
310e0 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69    ** zero if thi
310f0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72  s is the last fr
31100 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
31110 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  e. */.        iT
31120 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
31130 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
31140 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
31150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
31160 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
31170 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34  9841-13798 The 4
31180 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
31190 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
311a0 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a  et 32.        **
311b0 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65   stores the page
311c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
311d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
311e0 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65   freelist, or ze
311f0 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  ro if.        **
31200 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
31210 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
31220 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
31230 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31240 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
31250 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
31260 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
31270 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
31280 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e  runk>mxPage || n
31290 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a  Search++ > n ){.
312a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
312b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
312c0 28 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50  (pPrevTrunk ? pP
312d0 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a  revTrunk->pgno :
312e0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
312f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
31300 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
31310 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
31320 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
31330 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
31340 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
31350 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
31360 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31370 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
31380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
31390 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
313a0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
313b0 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
313c0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
313d0 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
313e0 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
313f0 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
31400 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
31410 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
31420 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
31430 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
31440 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
31450 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
31460 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
31470 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
31480 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
31490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
314a0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
314b0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
314c0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
314d0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
314e0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
314f0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
31500 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
31510 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
31520 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
31530 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
31540 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
31550 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
31560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31570 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
31580 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31590 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
315a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
315b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
315c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
315d0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
315e0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
315f0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
31600 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
31610 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
31620 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
31630 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
31640 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
31650 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
31660 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
31670 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
31680 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
31690 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
316a0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
316b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
316c0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
316d0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
316e0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
316f0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
31700 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
31710 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
31720 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
31730 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
31740 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
31750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31760 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31770 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31780 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
31790 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
317a0 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
317b0 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
317c0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
317d0 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
317e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
317f0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
31800 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
31810 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
31820 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
31830 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
31840 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
31850 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
31860 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31870 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
31880 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
31890 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
318a0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
318b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
318c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
318d0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
318e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
318f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
31900 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
31910 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
31920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
31930 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
31940 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
31950 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
31960 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
31970 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
31980 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31990 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
319a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
319b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
319c0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
319d0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
319e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
319f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
31a10 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
31a20 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
31a30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
31a40 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
31a50 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
31a60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31a70 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
31a80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
31a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31aa0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
31ab0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
31ac0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
31ad0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
31ae0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
31af0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
31b00 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
31b10 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
31b20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
31b30 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
31b40 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
31b50 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
31b60 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
31b70 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
31b80 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
31b90 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
31ba0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
31bb0 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
31bc0 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
31bd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31be0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75  ORRUPT_PGNO(iTru
31bf0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
31c00 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31c10 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
31c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
31c30 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
31c40 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
31c50 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
31c60 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
31c70 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
31c80 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
31c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31ca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31cb0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31cc0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31cd0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
31ce0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31cf0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31d00 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
31d10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
31d20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31d40 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
31d50 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
31d60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
31d70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
31d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31d90 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
31da0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
31db0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
31dc0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
31dd0 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
31de0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
31df0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
31e00 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
31e10 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
31e20 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
31e30 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
31e40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31e50 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
31e60 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
31e70 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
31e80 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
31e90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31ea0 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
31eb0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
31ec0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
31ed0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
31ee0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
31ef0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31f00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31f10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31f20 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
31f30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
31f40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31f50 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
31f60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31f70 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
31f80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
31f90 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
31fa0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
31fb0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31fd0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
31fe0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
31ff0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
32000 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
32010 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
32020 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
32030 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
32040 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
32050 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
32060 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
32070 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
32080 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
32090 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
320a0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
320b0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
320c0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
320d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
320e0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
320f0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
32100 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
32110 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
32120 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
32130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
32140 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
32150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32160 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
32170 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
32180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32190 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
321a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
321b0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
321c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
321d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
321e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
321f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32210 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
32220 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
32230 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
32240 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
32250 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
32260 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
32270 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
32280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
32290 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
322a0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
322b0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
322c0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
322d0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
322e0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
322f0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
32300 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
32310 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
32320 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
32330 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32360 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
32370 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
32380 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
32390 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
323a0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
323b0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
323c0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
323d0 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
323e0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
323f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
32400 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
32410 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  k);.          go
32420 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32430 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
32440 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32450 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
32460 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
32470 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
32480 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d       || (iPage==
32490 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65  nearby || (iPage
324a0 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
324b0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
324c0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
324d0 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
324e0 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  nt;.          *p
324f0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
32500 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
32510 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
32520 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
32530 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
32550 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
32560 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
32570 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
32580 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
32590 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
325a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
325b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
325c0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
325d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
325e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
325f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32600 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
32610 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
32620 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32630 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
32640 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
32650 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
32660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
32670 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
32680 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
32690 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
326a0 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
326b0 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f  nt(pBt, *pPgno)?
326c0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
326d0 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20  TENT : 0;.      
326e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
326f0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
32700 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
32710 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
32720 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32740 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32750 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
32760 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
32770 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
32780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32790 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
327a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
327b0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
327c0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
327d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
327e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
327f0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
32800 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32810 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
32820 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
32830 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
32840 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
32850 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
32860 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
32870 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
32880 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
32890 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
328a0 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67  append a new pag
328b0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
328c0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
328d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
328e0 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65  rmally, new page
328f0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
32900 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65  his block can be
32910 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
32920 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
32930 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
32940 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
32950 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76  g set. This prev
32960 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20  ents the pager. 
32970 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
32980 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  g to read the pa
32990 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ges content from
329a0 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20   disk. However, 
329b0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  if the.    ** cu
329c0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
329d0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  n has already ru
329e0 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  n one or more in
329f0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
32a00 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74  .    ** steps, t
32a10 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20  hen the page we 
32a20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c  are about to all
32a30 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69  ocate may contai
32a40 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  n content.    **
32a50 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
32a60 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
32a70 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e  f a rollback. In
32a80 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20   this case, do. 
32a90 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68     ** not set th
32aa0 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61  e no-content fla
32ab0 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74  g. This causes t
32ac0 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64  he pager to load
32ad0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   and journal.   
32ae0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
32af0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66  page content bef
32b00 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
32b10 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  it..    **.    *
32b20 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
32b30 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  pager will not a
32b40 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20  ctually attempt 
32b50 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e  to load or journ
32b60 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  al .    ** conte
32b70 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  nt for any page 
32b80 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73  that really does
32b90 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e   lie past the en
32ba0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
32bb0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e  e.    ** file on
32bc0 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66   disk. So the ef
32bd0 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69  fects of disabli
32be0 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  ng the no-conten
32bf0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  t optimization. 
32c00 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63     ** here are c
32c10 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65  onfined to those
32c20 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
32c30 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
32c40 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  of the.    ** da
32c50 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64  tabase image and
32c60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
32c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
32c80 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e     */.    int bN
32c90 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49  oContent = (0==I
32ca0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
32cb0 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50  bDoTruncate))? P
32cc0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
32cd0 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20  NT:0;..    rc = 
32ce0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32cf0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
32d00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
32d10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
32d20 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
32d30 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
32d40 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
32d50 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
32d60 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
32d70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32d80 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32d90 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
32da0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
32db0 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
32dc0 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
32dd0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
32de0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
32df0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
32e00 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
32e10 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
32e20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
32e30 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
32e40 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
32e50 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
32e60 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
32e70 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
32e80 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
32e90 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
32ea0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
32eb0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
32ec0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
32ed0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
32ee0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
32ef0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
32f00 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
32f10 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
32f20 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
32f30 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
32f40 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
32f50 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
32f60 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
32f70 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
32f80 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
32f90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32fa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32fc0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
32fd0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
32fe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
32ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33000 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
33010 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
33020 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
33030 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
33040 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
33050 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
33060 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
33070 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
33080 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
33090 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
330a0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
330b0 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
330c0 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
330d0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
330e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
330f0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
33100 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
33110 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
33120 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
33130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
33150 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33160 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
33170 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
33180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33190 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
331a0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
331b0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
331c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
331d0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
331e0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
331f0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
33200 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
33210 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
33220 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
33230 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
33240 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
33250 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
33260 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
33270 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
33280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33290 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
332a0 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
332b0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c  Page)->pDbPage)<
332c0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
332d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
332e0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
332f0 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  it==0 );.  retur
33300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
33310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33320 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
33330 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
33340 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
33350 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
33360 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
33370 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
33380 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
33390 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
333a0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
333b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
333c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
333d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
333e0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
333f0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
33400 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
33410 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
33420 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
33430 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
33440 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
33450 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
33460 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
33470 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
33480 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
33490 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
334a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
334b0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
334c0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
334d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
334e0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
334f0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
33500 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
33510 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
33520 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
33530 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
33540 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
33550 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
33560 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
33570 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
33580 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
33590 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
335a0 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
335b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
335c0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
335d0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
335e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
335f0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
33600 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
33610 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
33620 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
33630 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
33640 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
33650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33660 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
33670 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
33680 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
33690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
336b0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
336c0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
336d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336e0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
336f0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
33700 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
33710 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33720 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
33730 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
33740 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
33750 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
33760 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
33770 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
33780 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
33790 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74  f( iPage<2 ) ret
337a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
337b0 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70  PT_BKPT;.  if( p
337c0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
337d0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
337e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
337f0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
33800 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
33810 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
33820 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
33830 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
33840 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
33850 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
33860 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
33870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33880 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
33890 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
338a0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
338b0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
338c0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
338d0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
338e0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
338f0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
33900 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
33910 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33920 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
33930 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
33940 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
33950 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
33960 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
33970 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
33980 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
33990 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
339a0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
339b0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
339c0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
339d0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
339e0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
339f0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
33a00 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
33a10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
33a20 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
33a30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
33a40 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
33a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
33a60 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
33a70 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
33a80 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
33a90 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
33aa0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
33ab0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
33ac0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
33ad0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
33ae0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
33af0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
33b00 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
33b10 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
33b20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
33b30 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
33b40 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
33b50 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
33b60 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
33b70 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
33b80 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
33b90 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
33ba0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
33bb0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
33bc0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
33bd0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
33be0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
33bf0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
33c00 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
33c10 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
33c20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
33c30 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
33c40 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
33c50 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
33c60 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
33c70 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
33c80 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
33c90 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
33ca0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
33cb0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
33cc0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
33cd0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
33ce0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
33cf0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
33d00 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
33d10 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
33d20 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
33d30 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
33d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33d50 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
33d60 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
33d70 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
33d80 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
33d90 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
33da0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
33db0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
33dc0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
33dd0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
33de0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33df0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
33e00 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33e10 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
33e20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
33e30 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
33e40 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
33e50 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
33e60 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
33e70 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
33e80 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
33e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
33ea0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33eb0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
33ec0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
33ed0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
33ee0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
33ef0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
33f00 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
33f10 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
33f20 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
33f30 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
33f40 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
33f50 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
33f60 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
33f70 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
33f80 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
33f90 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
33fa0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
33fb0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
33fc0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
33fd0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
33fe0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
33ff0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
34000 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
34010 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
34020 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
34030 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
34040 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
34050 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
34060 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
34070 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34080 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
34090 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
340a0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
340b0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
340c0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
340d0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
340e0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
340f0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
34100 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
34110 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
34120 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
34130 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
34140 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
34150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
34160 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
34170 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
34180 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
34190 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
341a0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
341b0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
341c0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
341d0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
341e0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
341f0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
34200 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
34210 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
34220 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
34230 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
34240 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
34250 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
34260 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34270 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
34280 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
34290 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
342a0 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
342b0 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
342c0 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
342d0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
342e0 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
342f0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
34300 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
34310 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
34320 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
34330 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
34340 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
34350 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
34360 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
34370 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
34380 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34390 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
343a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
343b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
343c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
343d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
343e0 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
343f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
34400 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
34410 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
34420 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
34430 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
34440 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
34450 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
34460 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34470 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
34480 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
34490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
344a0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
344b0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
344c0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
344d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
344e0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
344f0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
34500 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
34510 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
34520 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34530 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34540 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
34550 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
34560 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
34570 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
34580 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
34590 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
345a0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
345b0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
345c0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
345d0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
345e0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
345f0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
34600 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
34610 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
34620 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
34630 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
34640 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
34650 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
34660 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
34670 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
34680 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
34690 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
346a0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
346b0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
346c0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
346d0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
346e0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
346f0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
34700 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34710 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
34720 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34730 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
34740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34750 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
34760 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34770 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
34780 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
34790 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
347a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
347b0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
347c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
347d0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
347e0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
347f0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
34800 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
34810 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
34820 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
34830 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
34840 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
34850 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
34860 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
34870 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
34880 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
34890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
348a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
348b0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
348c0 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
348d0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
348e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
348f0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
34900 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
34910 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
34920 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
34930 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
34940 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
34950 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
34960 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Cell.  Store.** 
34970 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  size information
34980 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20   about the cell 
34990 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  in pInfo..*/.sta
349a0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
349b0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
349c0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
349d0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
349e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c  ontains the Cell
349f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
34a00 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f  har *pCell,    /
34a10 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
34a20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65  the Cell */.  Ce
34a30 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
34a40 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69         /* Size i
34a50 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
34a60 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   the cell */.){.
34a70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
34a80 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
34a90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
34aa0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
34ab0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
34ac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
34ad0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
34ae0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
34af0 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
34b00 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
34b10 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28  l, pInfo);.  if(
34b20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d   pInfo->nLocal==
34b30 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
34b40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
34b50 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
34b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
34b70 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
34b80 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
34b90 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
34ba0 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20  +pInfo->nSize-1 
34bb0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
34bc0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29  Page->maskPage )
34bd0 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78  {.    /* Cell ex
34be0 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
34bf0 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 65  f page */.    re
34c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34c10 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
34c20 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
34c30 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
34c40 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   + pInfo->nSize 
34c50 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  - 4);.  pBt = pP
34c60 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
34c70 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
34c80 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
34c90 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
34ca0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
34cb0 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66  .  nOvfl = (pInf
34cc0 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49  o->nPayload - pI
34cd0 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  nfo->nLocal + ov
34ce0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
34cf0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
34d00 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20  assert( nOvfl>0 
34d10 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54  || .    (CORRUPT
34d20 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e  _DB && (pInfo->n
34d30 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61  Payload + ovflPa
34d40 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65  geSize)<ovflPage
34d50 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69  Size).  );.  whi
34d60 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
34d70 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
34d80 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
34d90 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
34da0 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
34db0 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
34dc0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
34dd0 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
34de0 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
34df0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
34e00 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
34e10 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
34e20 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
34e30 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
34e40 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
34e50 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
34e60 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
34e70 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
34e80 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
34e90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
34ea0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
34eb0 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
34ec0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
34ed0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
34ee0 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
34ef0 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
34f00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34f10 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
34f20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
34f30 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
34f40 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
34f50 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
34f60 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
34f70 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
34f80 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
34f90 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
34fa0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
34fb0 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
34fc0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
34fd0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
34fe0 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
34ff0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
35000 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
35010 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
35020 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
35030 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
35040 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
35050 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
35060 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
35070 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
35080 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
35090 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
350a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
350b0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
350c0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
350d0 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
350e0 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
350f0 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
35100 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
35110 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
35120 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
35130 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
35140 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
35150 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
35160 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
35170 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
35180 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
35190 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
351a0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
351b0 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
351c0 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
351d0 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
351e0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
351f0 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
35200 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
35210 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
35220 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35230 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
35240 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
35250 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
35260 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
35270 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
35280 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35290 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
352a0 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
352b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
352c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
352d0 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
352e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
352f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
35300 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
35310 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
35320 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
35330 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
35340 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
35350 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
35360 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
35370 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
35380 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
35390 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
353a0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
353b0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
353c0 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
353d0 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
353e0 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
353f0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
35400 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
35410 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
35420 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
35430 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
35440 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
35450 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
35460 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
35470 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
35480 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
35490 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
354a0 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
354b0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
354c0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
354d0 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
354e0 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
354f0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
35500 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
35510 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
35520 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
35530 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
35540 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
35550 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
35560 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
35570 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
35580 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
35590 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
355a0 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f  const BtreePaylo
355b0 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f  ad *pX,        /
355c0 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77  * Payload with w
355d0 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63  hich to construc
355e0 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  t the cell */.  
355f0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
35600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35610 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
35620 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
35630 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
35640 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
35650 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
35660 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63  , mn;.  int spac
35670 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
35680 20 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20   *pToRelease;.  
35690 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
356a0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
356b0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
356c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
356d0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
356e0 66 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65  fl;.  int nHeade
356f0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
35700 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35710 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35720 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
35730 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
35740 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
35750 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
35760 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
35770 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
35780 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
35790 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
357a0 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
357b0 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
357c0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
357d0 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
357e0 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d  Data[pPage->pBt-
357f0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
35800 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
35810 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35820 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35830 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
35840 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
35850 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
35860 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
35870 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  e;.  if( pPage->
35880 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50  intKey ){.    nP
35890 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61  ayload = pX->nDa
358a0 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a  ta + pX->nZero;.
358b0 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70      pSrc = pX->p
358c0 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
358d0 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20   pX->nData;.    
358e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
358f0 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20  ntKeyLeaf ); /* 
35900 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
35910 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61  y called for lea
35920 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64  ves */.    nHead
35930 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
35940 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
35950 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
35960 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
35970 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
35980 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
35990 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  pX->nKey);.  }el
359a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
359b0 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66  pX->nKey<=0x7fff
359c0 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79  ffff && pX->pKey
359d0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20  !=0 );.    nSrc 
359e0 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e  = nPayload = (in
359f0 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20  t)pX->nKey;.    
35a00 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b  pSrc = pX->pKey;
35a10 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
35a20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
35a30 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
35a40 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20  yload);.  }.  . 
35a50 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
35a60 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61  payload */.  pPa
35a70 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
35a80 48 65 61 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e  Header];.  if( n
35a90 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
35aa0 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
35ab0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
35ac0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
35ad0 20 65 76 65 72 79 74 68 69 6e 67 20 66 69 74 73   everything fits
35ae0 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 70 61   on the btree pa
35af0 67 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f  ge.    ** and no
35b00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
35b10 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  are required. */
35b20 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
35b30 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
35b40 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
35b50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
35b60 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
35b70 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
35b80 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
35b90 20 20 20 61 73 73 65 72 74 28 20 6e 53 72 63 3c     assert( nSrc<
35ba0 3d 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  =nPayload );.   
35bb0 20 74 65 73 74 63 61 73 65 28 20 6e 53 72 63 3c   testcase( nSrc<
35bc0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
35bd0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
35be0 20 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20   pSrc, nSrc);.  
35bf0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
35c00 64 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c  d+nSrc, 0, nPayl
35c10 6f 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72  oad-nSrc);.    r
35c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
35c40 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
35c50 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
35c60 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   some of the con
35c70 74 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20  tent will need. 
35c80 20 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74   ** to spill ont
35c90 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
35ca0 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50  ..  */.  mn = pP
35cb0 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
35cc0 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
35cd0 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
35ce0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35cf0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65 73 74  ize - 4);.  test
35d00 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
35d10 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
35d20 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
35d30 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
35d40 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
35d50 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
35d60 6d 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  mn;.  spaceLeft 
35d70 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  = n;.  *pnSize =
35d80 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
35d90 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
35da0 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a  ell[nHeader+n];.
35db0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30    pToRelease = 0
35dc0 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  ;.  pgnoOvfl = 0
35dd0 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
35de0 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  >pBt;..  /* At t
35df0 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
35e00 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
35e10 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
35e20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
35e30 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
35e40 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
35e50 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
35e60 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
35e70 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
35e80 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
35e90 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
35ea0 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
35eb0 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
35ec0 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
35ed0 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
35ee0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
35ef0 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
35f00 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
35f10 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
35f20 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
35f30 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
35f40 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
35f50 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
35f60 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
35f70 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
35f80 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
35f90 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
35fa0 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
35fb0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
35fc0 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
35fd0 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
35fe0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
35ff0 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
36000 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
36010 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
36020 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
36030 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
36040 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
36050 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
36060 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
36070 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
36080 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
36090 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
360a0 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79  =(int)(info.pPay
360b0 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b  load - pCell) );
360c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66  .    assert( inf
360d0 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79  o.nKey==pX->nKey
360e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
360f0 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
36100 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
36110 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
36120 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
36130 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
36140 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
36150 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
36160 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
36170 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
36180 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
36190 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 6e  hile( 1 ){.    n
361a0 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
361b0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
361c0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
361d0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
361e0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
361f0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
36200 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
36210 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
36220 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
36230 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
36240 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
36250 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
36260 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
36270 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
36280 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36290 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
362a0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
362b0 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
362c0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
362d0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
362e0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
362f0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
36300 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
36310 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
36320 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
36330 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
36340 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
36350 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
36360 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36370 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36380 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
36390 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
363a0 69 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20  if( nSrc>=n ){. 
363b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
363c0 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
363d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53      }else if( nS
363e0 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  rc>0 ){.      n 
363f0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 6d 65  = nSrc;.      me
36400 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
36410 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
36420 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
36430 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
36440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
36450 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  load -= n;.    i
36460 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29  f( nPayload<=0 )
36470 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 50 61 79   break;.    pPay
36480 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
36490 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
364a0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
364b0 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
364c0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
364d0 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  0 ){.      MemPa
364e0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23  ge *pOvfl = 0;.#
364f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36500 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36510 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
36520 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
36530 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
36540 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
36550 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
36560 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
36570 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
36580 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
36590 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
365a0 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
365b0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
365c0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
365d0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
365e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
365f0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
36600 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
36610 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
36620 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
36630 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
36640 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
36650 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
36660 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36670 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
36680 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
36690 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
366a0 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
366b0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
366c0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
366d0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
366e0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
366f0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
36700 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
36710 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
36720 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
36730 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
36740 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
36750 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
36760 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
36770 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
36780 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
36790 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
367a0 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
367b0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
367c0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
367d0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
367e0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
367f0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
36800 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
36810 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
36820 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
36830 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
36840 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
36850 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
36860 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
36870 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
36880 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
36890 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
368a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
368b0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
368c0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
368d0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
368e0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
368f0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
36900 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
36910 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
36920 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
36930 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
36940 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
36950 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
36960 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
36970 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
36980 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
36990 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
369a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
369b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
369c0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
369d0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
369e0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
369f0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
36a00 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
36a10 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
36a20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
36a30 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
36a40 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
36a50 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
36a60 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
36a70 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36a80 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
36a90 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
36aa0 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
36ab0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
36ac0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
36ad0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
36ae0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
36af0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
36b00 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
36b10 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
36b20 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
36b30 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
36b40 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
36b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36b60 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36b70 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
36b80 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
36b90 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
36ba0 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
36bb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36bc0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
36bd0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
36be0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
36bf0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
36c00 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
36c10 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
36c20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
36c30 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
36c40 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
36c50 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
36c60 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
36c70 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
36c80 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
36c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36ca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
36cb0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
36cc0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
36cd0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
36ce0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
36cf0 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
36d00 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
36d10 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
36d20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
36d30 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
36d40 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
36d50 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
36d60 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
36d70 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
36d80 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
36d90 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
36da0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
36db0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
36dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
36dd0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
36de0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
36df0 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
36e00 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
36e10 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
36e20 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
36e30 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
36e40 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
36e50 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
36e60 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
36e70 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
36e80 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
36e90 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
36ea0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
36eb0 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
36ec0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
36ed0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
36ee0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
36ef0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
36f00 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
36f10 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
36f20 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
36f30 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
36f40 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
36f50 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
36f60 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
36f70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
36f80 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
36f90 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
36fa0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
36fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36fc0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36fd0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
36fe0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
36ff0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37000 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
37010 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
37020 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
37030 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
37040 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
37050 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
37060 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
37070 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
37080 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
37090 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
370a0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
370b0 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
370c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
370d0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
370e0 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
370f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
37100 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
37110 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
37120 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
37130 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
37140 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
37150 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
37160 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
37170 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
37180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
37190 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
371a0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ll==0 ){.    mem
371b0 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
371c0 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74  , 0, 4);.    dat
371d0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
371e0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
371f0 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+5], pPage->
37200 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
37210 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
37220 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ee = pPage->pBt-
37230 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50  >usableSize - pP
37240 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20  age->hdrOffset. 
37250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37260 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63        - pPage->c
37270 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b  hildPtrSize - 8;
37280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
37290 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
372a0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
372b0 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70  l - idx));.    p
372c0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
372d0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
372e0 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
372f0 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  nFree += 2;.  }.
37300 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
37310 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
37320 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
37330 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
37340 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
37350 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
37360 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
37370 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
37380 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
37390 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
373a0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
373b0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
373c0 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
373d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
373e0 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
373f0 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
37400 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
37410 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
37420 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
37430 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
37440 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
37450 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
37460 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
37470 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
37480 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
37490 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
374a0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
374b0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
374c0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
374d0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
374e0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
374f0 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
37500 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
37510 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d  ed..**.** *pRC m
37520 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b  ust be SQLITE_OK
37530 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
37540 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
37550 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
37560 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
37570 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
37580 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
37590 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
375a0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
375b0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
375c0 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
375d0 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
375e0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
375f0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
37600 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
37610 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
37620 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
37630 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
37640 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
37650 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
37660 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
37670 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
37680 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
37690 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
376a0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
376b0 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
376c0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
376d0 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
376e0 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
376f0 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
37700 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
37710 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
37720 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
37730 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
37740 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
37750 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
37760 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
37770 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
37780 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  unter */.  u8 *d
37790 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
377a0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
377b0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
377c0 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20  .  u8 *pIns;    
377d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
377e0 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  t in pPage->aCel
377f0 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20  lIdx[] where no 
37800 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f  cell inserted */
37810 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 43  ..  assert( *pRC
37820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
37830 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
37840 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
37850 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
37860 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
37870 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
37880 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
37890 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
378a0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
378b0 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
378c0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
378d0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
378e0 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
378f0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
37900 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
37910 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
37920 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
37930 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
37940 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37950 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
37960 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
37970 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
37980 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
37990 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
379a0 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
379b0 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
379c0 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
379d0 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
379e0 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
379f0 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
37a00 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
37a10 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
37a20 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
37a30 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
37a40 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
37a50 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
37a60 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
37a70 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
37a80 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
37a90 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
37aa0 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
37ab0 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
37ac0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
37ad0 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
37ae0 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
37af0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
37b00 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
37b10 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
37b20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
37b30 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
37b40 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
37b50 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
37b60 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
37b70 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
37b80 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
37b90 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
37ba0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
37bb0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
37bc0 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
37bd0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
37be0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
37bf0 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ;.    /* Compari
37c00 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61  son against Arra
37c10 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65  ySize-1 since we
37c20 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65   hold back one e
37c30 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a  xtra slot.    **
37c40 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63   as a contingenc
37c50 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
37c60 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d  ds, never need m
37c70 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66  ore than 3 overf
37c80 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73  low.    ** slots
37c90 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f 63   but 4 are alloc
37ca0 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62 65  ated, just to be
37cb0 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73   safe. */.    as
37cc0 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79 53  sert( j < ArrayS
37cd0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
37ce0 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l)-1 );.    pPag
37cf0 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
37d00 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
37d10 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
37d20 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  6)i;..    /* Whe
37d30 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
37d40 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79  lows occur, they
37d50 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71 75   are always sequ
37d60 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20  ential and in.  
37d70 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
37d80 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69 61  r.  This invaria
37d90 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75 73  nts arise becaus
37da0 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  e multiple overf
37db0 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20  lows can.    ** 
37dc0 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
37dd0 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64 65  inserting divide
37de0 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  r cells into the
37df0 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75 72   parent page dur
37e00 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e  ing.    ** balan
37e10 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64 69  cing, and the di
37e20 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61 63  viders are adjac
37e30 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a  ent and sorted..
37e40 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
37e50 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65  t( j==0 || pPage
37e60 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75  ->aiOvfl[j-1]<(u
37e70 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66  16)i ); /* Overf
37e80 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20 6f  lows in sorted o
37e90 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  rder */.    asse
37ea0 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70  rt( j==0 || i==p
37eb0 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
37ec0 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72  ]+1 );   /* Over
37ed0 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65 6e  flows are sequen
37ee0 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  tial */.  }else{
37ef0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
37f00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37f10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
37f20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
37f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37f40 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
37f50 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
37f60 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
37f70 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37f80 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
37f90 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
37fa0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
37fb0 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61     assert( &data
37fc0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
37fd0 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c  et]==pPage->aCel
37fe0 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20 3d  lIdx );.    rc =
37ff0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
38000 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
38010 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
38020 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
38030 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
38040 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
38050 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
38060 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
38070 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
38080 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
38090 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a  successfully */.
380a0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
380b0 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
380c0 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67 65  rt( idx >= pPage
380d0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
380e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c  Page->nCell+2 ||
380f0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
38100 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
38110 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
38120 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
38130 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
38140 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
38150 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
38160 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43  y(&data[idx], pC
38170 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66  ell, sz);.    if
38180 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
38190 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
381a0 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
381b0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d      }.    pIns =
381c0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
381d0 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d   + i*2;.    memm
381e0 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73  ove(pIns+2, pIns
381f0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
38200 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75 74  l - i));.    put
38210 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78 29  2byte(pIns, idx)
38220 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
38230 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63  ll++;.    /* inc
38240 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c 20  rement the cell 
38250 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  count */.    if(
38260 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e   (++data[pPage->
38270 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30  hdrOffset+4])==0
38280 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68   ) data[pPage->h
38290 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20  drOffset+3]++;. 
382a0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
382b0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
382c0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
382d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
382e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
382f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
38300 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
38310 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
38320 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
38330 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
38340 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
38350 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
38360 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
38370 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
38380 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
38390 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
383a0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
383b0 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
383c0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
383d0 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
383e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
383f0 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72  ../*.** A CellAr
38400 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  ray object conta
38410 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20 70  ins a cache of p
38420 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65  ointers and size
38430 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65  s for a.** conse
38440 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65 20  cutive sequence 
38450 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69  of cells that mi
38460 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 6d  ght be held on m
38470 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a  ultiple pages..*
38480 2f 0a 74 79 70 65 64 65 66 20 73 7