/ Hex Artifact Content
Login

Artifact b517c680d108228e4ff2de9182957f96b9932057fed5e4322eaabe0c95e2b7df:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
5440: 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
5450: 72 2d 6d 61 70 20 64 6f 65 73 20 6e 6f 74 20 63  r-map does not c
5460: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
5470: 65 73 20 77 69 74 68 20 61 20 70 61 72 65 6e 74  es with a parent
5480: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 30 2e 20 43  .** page of 0. C
5490: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
54a0: 29 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  ) multiple times
54b0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 65   to output the e
54c0: 6e 74 69 72 65 0a 2a 2a 20 64 61 74 61 20 73 74  ntire.** data st
54d0: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 64 6f  ructure if it do
54e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
54f0: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 43 68  id btreePtrmapCh
5500: 65 63 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42  eck(BtShared *pB
5510: 74 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  t, Pgno nPage){.
5520: 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20    Pgno i;.  int 
5530: 62 50 72 6f 62 6c 65 6d 20 3d 20 30 3b 0a 20 20  bProblem = 0;.  
5540: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 20 3d  BtreePtrmap *p =
5550: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 0a 20 20 66   pBt->pMap;..  f
5560: 6f 72 28 69 3d 70 2d 3e 69 46 69 72 73 74 3b 20  or(i=p->iFirst; 
5570: 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
5580: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
5590: 2a 70 45 6e 74 72 79 20 3d 20 26 70 2d 3e 61 50  *pEntry = &p->aP
55a0: 74 72 5b 69 2d 70 2d 3e 69 46 69 72 73 74 5d 3b  tr[i-p->iFirst];
55b0: 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
55c0: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f  >eType==PTRMAP_O
55d0: 56 45 52 46 4c 4f 57 31 0a 20 20 20 20 20 7c 7c  VERFLOW1.     ||
55e0: 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
55f0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
5600: 0a 20 20 20 20 20 7c 7c 20 70 45 6e 74 72 79 2d  .     || pEntry-
5610: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42  >eType==PTRMAP_B
5620: 54 52 45 45 0a 20 20 20 20 29 7b 0a 20 20 20 20  TREE.    ){.    
5630: 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 61    if( pEntry->pa
5640: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
5650: 20 20 20 62 50 72 6f 62 6c 65 6d 20 3d 20 31 3b     bProblem = 1;
5660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5680: 7d 0a 0a 20 20 69 66 28 20 62 50 72 6f 62 6c 65  }..  if( bProble
5690: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  m ){.    for(i=p
56a0: 2d 3e 69 46 69 72 73 74 3b 20 69 3c 3d 6e 50 61  ->iFirst; i<=nPa
56b0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
56c0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
56d0: 74 72 79 20 3d 20 26 70 2d 3e 61 50 74 72 5b 69  try = &p->aPtr[i
56e0: 2d 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20  -p->iFirst];.   
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5700: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 0a  QLITE_CORRUPT, .
5710: 20 20 20 20 20 20 20 20 20 20 22 62 74 72 65 65            "btree
5720: 50 74 72 6d 61 70 43 68 65 63 6b 3a 20 70 67 6e  PtrmapCheck: pgn
5730: 6f 3d 25 64 20 65 54 79 70 65 3d 25 64 20 70 61  o=%d eType=%d pa
5740: 72 65 6e 74 3d 25 64 22 2c 20 0a 20 20 20 20 20  rent=%d", .     
5750: 20 20 20 20 20 28 69 6e 74 29 69 2c 20 28 69 6e       (int)i, (in
5760: 74 29 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  t)pEntry->eType,
5770: 20 28 69 6e 74 29 70 45 6e 74 72 79 2d 3e 70 61   (int)pEntry->pa
5780: 72 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  rent.      );.  
5790: 20 20 7d 0a 20 20 20 20 61 62 6f 72 74 28 29 3b    }.    abort();
57a0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 20 20 2f  .  }.}..#else  /
57b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
57c0: 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 23 20 64 65  NCURRENT */.# de
57d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
57e0: 41 6c 6c 6f 63 61 74 65 28 78 29 20 53 51 4c 49  Allocate(x) SQLI
57f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5800: 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
5810: 28 78 29 20 0a 23 20 64 65 66 69 6e 65 20 62 74  (x) .# define bt
5820: 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 78  reePtrmapBegin(x
5830: 2c 79 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  ,y)  SQLITE_OK.#
5840: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5850: 6d 61 70 45 6e 64 28 78 2c 79 2c 7a 29 20 0a 23  mapEnd(x,y,z) .#
5860: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5870: 6d 61 70 43 68 65 63 6b 28 79 2c 7a 29 20 0a 23  mapCheck(y,z) .#
5880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5890: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
58a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
58b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
58c0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
58d0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
58e0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
58f0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
5900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5910: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
5920: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5940: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
5950: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
5960: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5970: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
5980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5990: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
59a0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
59b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
59c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
59d0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
59e0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
59f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5a00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5a10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
5a20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
5a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5a40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5a50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
5a60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5a70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
5a80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
5a90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
5aa0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
5ab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
5ac0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
5ad0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
5ae0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
5af0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
5b10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
5b20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
5b30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
5b40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
5b50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
5b60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
5b70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
5b80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
5b90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
5ba0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
5bb0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5bd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
5be0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
5bf0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
5c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
5c10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
5c20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
5c30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
5c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5c50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
5c60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
5c70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
5c80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
5c90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
5ca0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5cb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
5cc0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
5cd0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
5ce0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5cf0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5d00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
5d10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
5d40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
5d50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
5d60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
5d70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5d80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
5d90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
5da0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
5db0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5dc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
5dd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
5de0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
5df0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
5e00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5e10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
5e20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
5e30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
5e40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
5e50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5e70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5e90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
5ea0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5eb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
5ec0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5ed0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
5ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
5ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
5f00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5f10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
5f20: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
5f30: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
5f40: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
5f50: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
5f60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
5f70: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
5f80: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
5f90: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
5fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
5fb0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5fc0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
5fd0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
5fe0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
5ff0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
6000: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
6010: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
6020: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
6030: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
6040: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
6050: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
6060: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
6070: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
6080: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
6090: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
60a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
60b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
60c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
60d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
60e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
60f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
6100: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
6110: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
6120: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
6130: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
6140: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
6150: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6160: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
6170: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
6180: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
6190: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
61a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
61b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
61d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
61e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6200: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
6210: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
6220: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
6230: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
6240: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
6250: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
6260: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
6270: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
6280: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
6290: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
62a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
62b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
62c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
62d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
62e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
62f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
6300: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6310: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6320: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
6330: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
6340: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
6350: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
6360: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
6370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
6380: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
6390: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
63a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
63c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
63d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
63e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
63f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
6400: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
6410: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
6420: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
6430: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6440: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
6450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6460: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
6470: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
6480: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
6490: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
64a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
64b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
64c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
64d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
64e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
64f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
6500: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
6510: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6520: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
6530: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
6540: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
6550: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
6560: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
6570: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
6580: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
6590: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
65a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
65b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
65c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
65d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
65e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
65f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
6600: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6610: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
6620: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
6630: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
6640: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
6650: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
6660: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
6670: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
6680: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
6690: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
66a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
66b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
66c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
66d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
66e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
66f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
6700: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
6710: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6720: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
6730: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
6740: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
6750: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
6760: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
6770: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
6780: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
6790: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
67a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
67b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
67c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
67d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
67e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
67f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
6800: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
6810: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
6820: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
6830: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
6840: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
6850: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
6860: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
6870: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6880: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
6890: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
68a0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
68b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
68c0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
68d0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
68e0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
68f0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
6900: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
6910: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
6920: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6930: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
6940: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
6950: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
6960: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
6970: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
6980: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
6990: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
69a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
69b0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
69c0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
69d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
69e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
69f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6a00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
6a10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
6a20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
6a30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
6a40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
6a50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6a60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
6a70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
6a80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
6a90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6aa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
6ab0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
6ac0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
6ad0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
6ae0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
6af0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
6b00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6b10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
6b20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
6b30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
6b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
6b50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6b70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
6b80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
6bc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
6bd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
6be0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
6bf0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
6c00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
6c10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
6c20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
6c30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6c40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
6c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
6c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
6ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
6cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
6d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
6d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
6d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
6da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
6db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
6dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
6e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
6e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
6e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
6ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
6eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
6ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
6f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
6f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
6f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
6fb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
6fc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6fd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6ff0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7000: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
7010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
7020: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
7030: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7040: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
7050: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
7060: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
7070: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
7080: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
7090: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
70a0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
70b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
70c0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
70d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
70e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
70f0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
7100: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
7110: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
7120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7130: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
7140: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7150: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
7160: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
7170: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7180: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
7190: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
71a0: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
71b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
71c0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
71d0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
71e0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
71f0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
7200: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
7210: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
7220: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
7230: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
7240: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
7250: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
7260: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
7270: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
7280: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
7290: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
72a0: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
72b0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
72c0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
72d0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
72e0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
72f0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
7300: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
7310: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
7320: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
7330: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
7340: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7360: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
7370: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
7380: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
7390: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
73a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
73b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
73c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
73d0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
73e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
73f0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
7400: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7410: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
7420: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
7440: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
7460: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
7470: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
7480: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
7490: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
74a0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
74b0: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
74c0: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
74d0: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
74e0: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
74f0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
7500: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
7510: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
7520: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
7530: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
7540: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
7550: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
7560: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
7570: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
7580: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
7590: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
75a0: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
75b0: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
75c0: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
75d0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
75e0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
75f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7600: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
7610: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
7620: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
7630: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
7640: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
7650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7660: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
7670: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
7680: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
7690: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
76a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
76c0: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
76d0: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
76e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
76f0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
7700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7710: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
7720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7730: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
7740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
7750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
7760: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
7770: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
7780: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
7790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
77a0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
77b0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
77c0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
77d0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
77e0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
77f0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
7800: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
7810: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
7820: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
7830: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
7840: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
7850: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
7860: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
7870: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
7880: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
7890: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
78a0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
78b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
78c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
78d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78e0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
78f0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
7900: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
7910: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
7920: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
7930: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
7940: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7950: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7960: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
7970: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7980: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
7990: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
79a0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
79b0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
79c0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
79d0: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
79e0: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
79f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7a00: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
7a10: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
7a20: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
7a30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7a40: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
7a50: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
7a60: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
7a70: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
7a80: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
7a90: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
7aa0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
7ab0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
7ac0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7ad0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
7ae0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
7af0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
7b00: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
7b10: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
7b20: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
7b30: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
7b40: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
7b50: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
7b60: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
7b70: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
7b80: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
7b90: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
7ba0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
7bb0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
7bc0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
7bd0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
7be0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
7bf0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
7c00: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
7c10: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
7c20: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
7c30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7c40: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
7c50: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
7c60: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
7c70: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
7c80: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
7c90: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
7ca0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
7cb0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
7cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
7cd0: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
7ce0: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
7cf0: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
7d00: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
7d10: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
7d20: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
7d30: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
7d40: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
7d50: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
7d60: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
7d70: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
7d80: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
7d90: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
7da0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
7db0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7dc0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
7dd0: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
7de0: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
7df0: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
7e00: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
7e10: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
7e20: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
7e30: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
7e40: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
7e50: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
7e60: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
7e70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
7e80: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
7e90: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
7ea0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
7eb0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
7ec0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
7ed0: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
7ee0: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
7ef0: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
7f00: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
7f10: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
7f20: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
7f30: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
7f40: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
7f50: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
7f60: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
7f70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
7f80: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
7f90: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
7fa0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
7fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7fc0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7fd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
7fe0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
7ff0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
8000: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
8010: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
8020: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
8030: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8040: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8050: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
8060: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
8070: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
8080: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
8090: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
80a0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
80b0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
80c0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
80d0: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
80e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
80f0: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
8100: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
8110: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
8120: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
8130: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
8140: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
8150: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
8160: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
8170: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
8180: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
8190: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
81a0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
81b0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
81c0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
81d0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
81e0: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
81f0: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
8200: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
8210: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
8220: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
8230: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
8240: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
8250: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
8260: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
8270: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
8280: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
8290: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
82a0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
82b0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
82c0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
82d0: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
82e0: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
82f0: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
8300: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
8310: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
8320: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8330: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8340: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
8350: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
8360: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8370: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
8380: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
8390: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
83a0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
83b0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
83c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
83d0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
83e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
83f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8400: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
8410: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
8420: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
8430: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
8440: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
8450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
8460: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
8470: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
8480: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
84a0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
84b0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
84c0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
84d0: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
84e0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
84f0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
8500: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
8510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8520: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
8530: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
8540: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
8550: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
8560: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
8570: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
8580: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
8590: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
85a0: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
85b0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
85c0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
85d0: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
85e0: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
85f0: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
8600: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
8610: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
8620: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
8630: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
8640: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8650: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
8660: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
8670: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
8680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
8690: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
86a0: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
86b0: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
86c0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
86e0: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
86f0: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
8700: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
8710: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
8720: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
8730: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
8740: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
8750: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
8760: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
8770: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8780: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
87b0: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
87c0: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
87d0: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
87e0: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
87f0: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
8800: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8810: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
8820: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
8830: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
8840: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
8860: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
8870: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
8880: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
8890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
88a0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
88b0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
88c0: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
88d0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
88e0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
88f0: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
8900: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
8910: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
8920: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
8930: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8940: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8950: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
8960: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
8970: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
8980: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
8990: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
89a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
89b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
89c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
89d0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
89e0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
89f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8a00: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
8a10: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
8a20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
8a40: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
8a50: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
8a60: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
8a70: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
8a80: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
8a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
8aa0: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
8ab0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
8ac0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
8ad0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
8ae0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
8af0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8b00: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
8b10: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
8b20: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
8b30: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
8b40: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
8b50: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
8b60: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
8b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
8b80: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8b90: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
8ba0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
8bb0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
8bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
8bd0: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
8be0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
8bf0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
8c00: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
8c10: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
8c20: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8c30: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
8c40: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
8c50: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
8c60: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
8c70: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
8c80: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
8c90: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
8ca0: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
8cb0: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
8cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8ce0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
8cf0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
8d00: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
8d10: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
8d20: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
8d30: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8d40: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
8d50: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
8d60: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
8d70: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
8d80: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
8d90: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
8da0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
8db0: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
8dc0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
8dd0: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
8de0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8df0: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
8e00: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
8e10: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
8e20: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8e30: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
8e40: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
8e50: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
8e60: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
8e70: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
8e80: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
8e90: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
8ea0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
8eb0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
8ec0: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
8ed0: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
8ee0: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
8ef0: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
8f00: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
8f10: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
8f20: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
8f30: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
8f40: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
8f50: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
8f60: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
8f70: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
8f80: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
8f90: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
8fa0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
8fb0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8fc0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
8fd0: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
8fe0: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
8ff0: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
9000: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
9010: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
9020: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
9030: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
9040: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
9050: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
9060: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
9070: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
9080: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
9090: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
90a0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
90b0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
90c0: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
90d0: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
90e0: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
90f0: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
9100: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9110: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
9120: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
9130: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
9140: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
9150: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
9160: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
9170: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
9180: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
9190: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
91a0: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
91b0: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
91c0: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
91d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
91e0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
91f0: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
9200: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
9210: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
9220: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
9230: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
9240: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
9250: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
9260: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
9270: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
9280: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
9290: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
92a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
92b0: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
92c0: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
92d0: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
92e0: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
92f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9300: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
9310: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
9320: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
9330: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
9340: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
9350: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
9360: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
9370: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
9380: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
9390: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
93a0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
93b0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
93c0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
93d0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
93e0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
93f0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
9400: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
9410: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
9420: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
9430: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
9440: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
9450: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
9460: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
9470: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
9480: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
9490: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
94a0: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
94b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
94c0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
94d0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
94e0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
94f0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
9500: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
9510: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
9520: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
9530: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
9540: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
9550: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
9560: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
9570: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
9580: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
9590: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
95a0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
95b0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
95c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
95d0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
95e0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
95f0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
9600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
9610: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
9620: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
9630: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
9640: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
9650: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
9660: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
9670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9680: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
9690: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
96a0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
96b0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
96c0: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
96d0: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
96e0: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
96f0: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
9700: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
9710: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
9720: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9730: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
9740: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
9750: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
9760: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
9770: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
9780: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
9790: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
97a0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
97b0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
97c0: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
97d0: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
97e0: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
97f0: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
9800: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
9810: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
9820: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
9830: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
9840: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9850: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
9860: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
9870: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
9880: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
9890: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
98a0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
98b0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
98c0: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
98d0: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
98e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
98f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
9900: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
9910: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
9920: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
9930: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
9940: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
9950: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
9960: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
9970: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
9980: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
9990: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
99a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
99b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
99c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
99d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
99e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
99f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
9a00: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
9a10: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
9a20: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
9a30: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
9a40: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
9a50: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
9a60: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
9a70: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
9a80: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
9a90: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
9aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
9ac0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
9ad0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
9ae0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
9af0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
9b00: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
9b10: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
9b20: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
9b30: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
9b40: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
9b50: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
9b60: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
9b70: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9b80: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
9b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
9ba0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
9bb0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
9bc0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
9bd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9be0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
9bf0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
9c00: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
9c10: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
9c20: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
9c30: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
9c40: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
9c50: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
9c60: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
9c70: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
9c80: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
9c90: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
9ca0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
9cb0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9cc0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
9cd0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
9ce0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
9cf0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
9d00: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
9d10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
9d20: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
9d30: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
9d40: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
9d50: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
9d60: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
9d70: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
9d80: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
9d90: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9da0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
9db0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
9dc0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
9dd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
9de0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
9df0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
9e00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
9e10: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
9e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9e30: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
9e40: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
9e50: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
9e60: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
9e70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9e80: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
9e90: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
9ea0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
9eb0: 62 65 72 20 69 73 20 6e 65 76 65 72 20 61 64 64  ber is never add
9ec0: 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  ed to a pointer-
9ed0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
9ee0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
9ef0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
9f00: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9f10: 74 29 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  t)) );..#ifndef 
9f20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
9f30: 55 52 52 45 4e 54 0a 20 20 69 66 28 20 70 42 74  URRENT.  if( pBt
9f40: 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70  ->pMap ){.    *p
9f50: 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  RC = btreePtrmap
9f60: 53 74 6f 72 65 28 70 42 74 2c 20 6b 65 79 2c 20  Store(pBt, key, 
9f70: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a  eType, parent);.
9f80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9f90: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
9fa0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
9fb0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
9fc0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
9fd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9fe0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
9ff0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
a000: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
a010: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
a020: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
a030: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
a040: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
a050: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
a060: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a070: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
a080: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
a090: 20 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33   ((char*)sqlite3
a0a0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
a0b0: 62 50 61 67 65 29 29 5b 30 5d 21 3d 30 20 29 7b  bPage))[0]!=0 ){
a0c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
a0d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 78  t byte of the ex
a0e0: 74 72 61 20 64 61 74 61 20 69 73 20 74 68 65 20  tra data is the 
a0f0: 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74 20 62  MemPage.isInit b
a100: 79 74 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  yte..    ** If t
a110: 68 61 74 20 62 79 74 65 20 69 73 20 73 65 74 2c  hat byte is set,
a120: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 70   it means this p
a130: 61 67 65 20 69 73 20 61 6c 73 6f 20 62 65 69 6e  age is also bein
a140: 67 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  g used.    ** as
a150: 20 61 20 62 74 72 65 65 20 70 61 67 65 2e 20 2a   a btree page. *
a160: 2f 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  /.    *pRC = SQL
a170: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a180: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
a190: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 6f 66  p_exit;.  }.  of
a1a0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
a1b0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
a1c0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
a1d0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
a1e0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
a1f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
a200: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
a210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
a220: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
a230: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
a240: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
a250: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
a260: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
a270: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
a280: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
a290: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
a2a0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
a2b0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
a2c0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
a2d0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
a2e0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
a2f0: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
a300: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
a310: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
a320: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
a330: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a340: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
a350: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
a360: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
a370: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
a380: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
a390: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
a3a0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
a3b0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
a3c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
a3d0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
a3e0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
a3f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a400: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
a410: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
a420: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
a430: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
a440: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
a450: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
a460: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
a470: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
a480: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
a490: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
a4a0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
a4b0: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
a4c0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
a4d0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
a4e0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
a4f0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
a500: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
a510: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
a520: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
a530: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
a540: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
a550: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
a560: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
a570: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
a580: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
a590: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
a5a0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
a5b0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
a5c0: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
a5d0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
a5e0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
a5f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a600: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
a610: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
a620: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
a630: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
a640: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a650: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
a660: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
a670: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
a680: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
a690: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
a6a0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
a6b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
a6c0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
a6d0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
a6e0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
a6f0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
a700: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
a710: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
a720: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
a730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a740: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a750: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
a760: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
a770: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
a780: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
a790: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
a7a0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
a7b0: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
a7c0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
a7d0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
a7e0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
a7f0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
a800: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
a810: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
a820: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a830: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50  _CORRUPT_PGNO(iP
a840: 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  trmap);.  return
a850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
a860: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
a870: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
a880: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
a890: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
a8a0: 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23  (w,x,y,z,rc).  #
a8b0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
a8c0: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
a8d0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
a8e0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
a8f0: 2c 20 79 2c 20 7a 2c 20 72 63 29 0a 23 65 6e 64  , y, z, rc).#end
a900: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
a910: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
a920: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
a930: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
a940: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
a950: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
a960: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
a970: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
a980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
a990: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
a9a0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
a9b0: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
a9c0: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
a9d0: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
a9e0: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
a9f0: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
aa00: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
aa10: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
aa20: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
aa30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
aa40: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
aa50: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
aa60: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
aa70: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
aa80: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
aa90: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
aaa0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
aab0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
aac0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
aad0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
aae0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
aaf0: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
ab00: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
ab10: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
ab20: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
ab30: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
ab40: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
ab50: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
ab60: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
ab70: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
ab80: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
ab90: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
aba0: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
abb0: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
abc0: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
abd0: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
abe0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
abf0: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
ac00: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
ac10: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
ac20: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
ac30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
ac40: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
ac50: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
ac60: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
ac70: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
ac80: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
ac90: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
aca0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
acb0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
acc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
acd0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
ace0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
acf0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
ad00: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
ad10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
ad20: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
ad30: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
ad40: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
ad50: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
ad60: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
ad70: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
ad80: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
ad90: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
ada0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
adb0: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
adc0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
add0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
ade0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
adf0: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
ae00: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
ae10: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
ae20: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
ae30: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
ae40: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
ae50: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
ae60: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
ae70: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
ae80: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
ae90: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
aea0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
aeb0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
aec0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
aed0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
aee0: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
aef0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
af00: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
af10: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
af20: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
af30: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
af40: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
af50: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
af60: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
af70: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
af80: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
af90: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
afa0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
afb0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
afc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
afd0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
afe0: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
aff0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
b000: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
b010: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
b020: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b030: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
b040: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
b050: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
b060: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
b070: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
b080: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
b090: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
b0a0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
b0b0: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
b0c0: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
b0d0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
b0e0: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
b0f0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
b100: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
b110: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
b120: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
b130: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b140: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
b150: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
b160: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
b170: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
b180: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
b190: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
b1a0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
b1b0: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
b1c0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
b1d0: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
b1e0: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
b1f0: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
b200: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
b210: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
b220: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
b230: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
b240: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
b250: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
b260: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
b270: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
b280: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
b290: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
b2a0: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
b2b0: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
b2c0: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
b2d0: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
b2e0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
b2f0: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
b300: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
b310: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
b320: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
b330: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
b340: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
b350: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
b360: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
b370: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
b380: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
b390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
b3a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
b3b0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
b3c0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
b3d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
b3e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
b3f0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
b400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b410: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b420: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b430: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
b440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b450: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b460: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
b470: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
b480: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b490: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
b4a0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
b4b0: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
b4c0: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
b4d0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
b4e0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
b4f0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
b500: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
b510: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
b520: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
b530: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
b540: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
b550: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
b560: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
b570: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
b580: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b5a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
b5b0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
b5c0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b5d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b5e0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b5f0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
b600: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
b610: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
b620: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
b630: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
b640: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
b650: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b660: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
b670: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b690: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
b6a0: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
b6b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b6c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b6d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b6e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
b6f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
b700: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
b710: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
b720: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
b730: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
b740: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
b750: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
b760: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
b770: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
b780: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
b790: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
b7a0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
b7b0: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
b7c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
b7d0: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
b7e0: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
b7f0: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
b800: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
b810: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
b820: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
b830: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
b840: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
b850: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
b860: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
b870: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
b880: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
b890: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
b8a0: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
b8b0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
b8c0: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
b8d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
b8e0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
b8f0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
b900: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
b910: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
b920: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
b930: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
b940: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
b950: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
b960: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
b970: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
b980: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
b990: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
b9a0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
b9b0: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
b9c0: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
b9d0: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
b9e0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
b9f0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ba00: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
ba10: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
ba30: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
ba40: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
ba50: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
ba60: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
ba70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ba80: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
ba90: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
baa0: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
bab0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
bac0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
bad0: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
bae0: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
baf0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
bb00: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
bb10: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
bb20: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
bb30: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
bb40: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
bb50: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
bb60: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
bb70: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
bb80: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
bb90: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
bba0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
bbb0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
bbc0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
bbd0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
bbe0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
bbf0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
bc00: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
bc10: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
bc20: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
bc30: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
bc40: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
bc50: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
bc60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
bc70: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
bc80: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
bc90: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
bca0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
bcb0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
bcc0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
bcd0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
bce0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
bcf0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
bd00: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
bd10: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
bd20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
bd30: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
bd40: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
bd50: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
bd60: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
bd70: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
bd80: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
bd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
bda0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
bdb0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
bdc0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
bdd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bde0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
bdf0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
be00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
be10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
be20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
be30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
be40: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
be50: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
be60: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
be70: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
be80: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
be90: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
bea0: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
beb0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
bec0: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
bed0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
bee0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
bef0: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
bf00: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
bf10: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
bf20: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
bf30: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
bf40: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
bf50: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
bf60: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
bf70: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
bf80: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
bf90: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
bfa0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
bfb0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
bfc0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
bfd0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
bfe0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
bff0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
c000: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
c010: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
c020: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
c030: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c040: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
c050: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
c060: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
c070: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
c080: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
c090: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
c0a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
c0b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
c0c0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
c0d0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
c0e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
c0f0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
c100: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
c110: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
c120: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
c130: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
c140: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
c150: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
c160: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
c170: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
c180: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
c190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
c1a0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
c1b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
c1c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
c1d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
c1e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
c1f0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
c200: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
c210: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
c220: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
c230: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
c240: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
c250: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
c260: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
c270: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
c280: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
c290: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
c2a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
c2b0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
c2c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
c2d0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
c2e0: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
c2f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
c300: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
c310: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
c320: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
c330: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
c340: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
c350: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
c360: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
c370: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
c380: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
c390: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
c3a0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
c3b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
c3c0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
c3d0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
c3e0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
c3f0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
c400: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
c410: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
c420: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
c430: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
c440: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
c450: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
c460: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
c470: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
c480: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
c490: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
c4a0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
c4b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
c4c0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
c4d0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
c4e0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
c4f0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
c520: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
c530: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
c540: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
c570: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
c580: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c590: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
c5a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c5b0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
c5c0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
c5d0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
c5e0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
c5f0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
c600: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
c610: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
c620: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
c630: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
c640: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
c650: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
c660: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c670: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
c680: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
c690: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
c6a0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
c6b0: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
c6c0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
c6d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
c6e0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
c6f0: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
c700: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
c710: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
c720: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
c730: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
c740: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
c750: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
c760: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
c770: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
c780: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
c790: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c7a0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
c7b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
c7c0: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
c7d0: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
c7e0: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
c7f0: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
c800: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
c810: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
c820: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
c830: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
c840: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
c850: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
c860: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
c870: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
c880: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
c890: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
c8a0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
c8b0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
c8c0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
c8d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
c8e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c8f0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
c900: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
c910: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
c920: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
c930: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
c940: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
c950: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c960: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
c970: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
c980: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
c990: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
c9a0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
c9b0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
c9c0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
c9d0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
c9e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
c9f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca00: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
ca10: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
ca20: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
ca30: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
ca40: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
ca50: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
ca60: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
ca70: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
ca80: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
ca90: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
caa0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
cab0: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
cac0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
cad0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
cae0: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
caf0: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
cb00: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
cb10: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
cb20: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
cb30: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
cb40: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
cb50: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
cb60: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
cb70: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
cb80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
cb90: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
cba0: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
cbb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
cbc0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
cbd0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
cbe0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
cbf0: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
cc00: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
cc10: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
cc20: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
cc30: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
cc40: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
cc50: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
cc60: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
cc70: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
cc80: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
cc90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
cca0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
ccb0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
ccc0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
ccd0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
cce0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
ccf0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
cd00: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
cd10: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
cd20: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
cd30: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
cd40: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
cd50: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
cd60: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
cd70: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
cd80: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
cd90: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
cda0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
cdb0: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
cdc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
cdd0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
cde0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
cdf0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
ce00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ce10: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
ce20: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
ce30: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
ce40: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
ce50: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
ce60: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
ce70: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
ce80: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ce90: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
cea0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
ceb0: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
cec0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
ced0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
cee0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cef0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
cf00: 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 43 65 6c  ** The cell pCel
cf10: 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  l is currently p
cf20: 61 72 74 20 6f 66 20 70 61 67 65 20 70 53 72 63  art of page pSrc
cf30: 20 62 75 74 20 77 69 6c 6c 20 75 6c 74 69 6d 61   but will ultima
cf40: 74 65 6c 79 20 62 65 20 70 61 72 74 0a 2a 2a 20  tely be part.** 
cf50: 6f 66 20 70 50 61 67 65 2e 20 20 28 70 53 72 63  of pPage.  (pSrc
cf60: 20 61 6e 64 20 70 50 61 67 65 72 20 61 72 65 20   and pPager are 
cf70: 6f 66 74 65 6e 20 74 68 65 20 73 61 6d 65 2e 29  often the same.)
cf80: 20 20 49 66 20 70 43 65 6c 6c 20 63 6f 6e 74 61    If pCell conta
cf90: 69 6e 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  ins a.** pointer
cfa0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
cfb0: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
cfc0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
cfd0: 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 0a 2a  ointer-map for.*
cfe0: 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  * the overflow p
cff0: 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
d000: 20 76 61 6c 69 64 20 61 66 74 65 72 20 70 43 65   valid after pCe
d010: 6c 6c 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ll has been move
d020: 64 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2f 0a 73  d to pPage..*/.s
d030: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
d040: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
d050: 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50  age *pPage, MemP
d060: 61 67 65 20 2a 70 53 72 63 2c 20 75 38 20 2a 70  age *pSrc, u8 *p
d070: 43 65 6c 6c 2c 69 6e 74 20 2a 70 52 43 29 7b 0a  Cell,int *pRC){.
d080: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
d090: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
d0a0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
d0b0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
d0c0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
d0d0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
d0e0: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
d0f0: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
d100: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
d110: 6f 20 6f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20  o ovfl;.    if( 
d120: 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 53  SQLITE_WITHIN(pS
d130: 72 63 2d 3e 61 44 61 74 61 45 6e 64 2c 20 70 43  rc->aDataEnd, pC
d140: 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e  ell, pCell+info.
d150: 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 20  nLocal) ){.     
d160: 20 74 65 73 74 63 61 73 65 28 20 70 53 72 63 21   testcase( pSrc!
d170: 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =pPage );.      
d180: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
d190: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d1a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
d1b0: 20 20 20 20 6f 76 66 6c 20 3d 20 67 65 74 34 62      ovfl = get4b
d1c0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
d1d0: 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70  nSize-4]);.    p
d1e0: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
d1f0: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
d200: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
d210: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
d220: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
d230: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
d240: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
d250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f  This routine reo
d260: 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77  rganizes cells w
d270: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ithin the.** pag
d280: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
d290: 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63  are no free-bloc
d2a0: 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62  ks on the free-b
d2b0: 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  lock list..**.**
d2c0: 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46   Parameter nMaxF
d2d0: 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d  rag is the maxim
d2e0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61  um amount of fra
d2f0: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68  gmented space th
d300: 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65  at may be.** pre
d310: 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65  sent in the page
d320: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
d330: 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ine returns..**.
d340: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
d350: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
d360: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
d370: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
d380: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
d390: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
d3a0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
d3b0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
d3c0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
d3d0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
d3e0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
d3f0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
d400: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
d410: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
d420: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
d430: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d440: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
d450: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
d460: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
d470: 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72  Page, int nMaxFr
d480: 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ag){.  int i;   
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d4b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d4e0: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
d4f0: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d510: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
d520: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
d530: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
d540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
d550: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
d560: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
d570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d580: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
d590: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
d5a0: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
d5b0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
d5c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
d5d0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
d5e0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
d5f0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
d600: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
d610: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
d620: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
d630: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
d640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d650: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
d660: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
d670: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
d680: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
d690: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
d6a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
d6b0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
d6c0: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
d6d0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
d6e0: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
d6f0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
d700: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
d710: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
d720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
d730: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d740: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
d750: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
d770: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
d780: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
d790: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d7a0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d7b0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d7c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d7d0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d7e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
d7f0: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
d800: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
d810: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
d820: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
d830: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d840: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d850: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d860: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
d870: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
d880: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
d890: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
d8a0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
d8b0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
d8c0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
d8d0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
d8e0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
d8f0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
d900: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 7c 7c  &data[hdr+3]) ||
d910: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
d920: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
d930: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
d940: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
d950: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
d960: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
d970: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
d980: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
d990: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
d9a0: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
d9b0: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
d9c0: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
d9d0: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
d9e0: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
d9f0: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
da00: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
da10: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
da20: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
da30: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
da40: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
da50: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
da60: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
da70: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
da80: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
da90: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
daa0: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
dab0: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
dac0: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
dad0: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
dae0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
daf0: 5b 68 64 72 2b 31 5d 29 3b 0a 0a 20 20 20 20 2f  [hdr+1]);..    /
db00: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c  * If the initial
db10: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
db20: 74 20 77 65 72 65 20 6f 75 74 20 6f 66 20 62 6f  t were out of bo
db30: 75 6e 64 73 2c 20 74 68 61 74 20 77 6f 75 6c 64  unds, that would
db40: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 62 65 65   have.    ** bee
db50: 6e 20 64 65 74 65 63 74 65 64 20 62 79 20 62 74  n detected by bt
db60: 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70  reeComputeFreeSp
db70: 61 63 65 28 29 20 77 68 65 6e 20 69 74 20 77 61  ace() when it wa
db80: 73 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 0a  s computing the.
db90: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
dba0: 20 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74   free bytes on t
dbb0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
dbc0: 61 73 73 65 72 74 28 20 69 46 72 65 65 3c 3d 75  assert( iFree<=u
dbd0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
dbe0: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
dbf0: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
dc00: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
dc10: 61 5b 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20  a[iFree]);.     
dc20: 20 69 66 28 20 69 46 72 65 65 32 3e 75 73 61 62   if( iFree2>usab
dc30: 6c 65 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72  leSize-4 ) retur
dc40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dc50: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
dc60: 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65      if( 0==iFree
dc70: 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65  2 || (data[iFree
dc80: 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46  2]==0 && data[iF
dc90: 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20  ree2+1]==0) ){. 
dca0: 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20         u8 *pEnd 
dcb0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
dcc0: 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
dcd0: 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72         u8 *pAddr
dce0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
dcf0: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
dd00: 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
dd10: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
dd20: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
dd30: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
dd40: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
dd50: 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72      if( top>=iFr
dd60: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
dd70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dd80: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
dd90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dda0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
ddb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ddc0: 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32   iFree+sz>iFree2
ddd0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dde0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ddf0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
de00: 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  sz2 = get2byte(&
de10: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b  data[iFree2+2]);
de20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
de30: 46 72 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62  Free2+sz2 > usab
de40: 6c 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20  leSize ) return 
de50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
de60: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
de70: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
de80: 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32  ata[iFree+sz+sz2
de90: 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73  ], &data[iFree+s
dea0: 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65  z], iFree2-(iFre
deb0: 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20  e+sz));.        
dec0: 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20    sz += sz2;.   
ded0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
dee0: 46 72 65 65 2b 73 7a 3e 75 73 61 62 6c 65 53 69  Free+sz>usableSi
def0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
df00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
df10: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
df20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
df30: 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70        cbrk = top
df40: 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73  +sz;.        ass
df50: 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65  ert( cbrk+(iFree
df60: 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53  -top) <= usableS
df70: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ize );.        m
df80: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72  emmove(&data[cbr
df90: 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20  k], &data[top], 
dfa0: 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20  iFree-top);.    
dfb0: 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64      for(pAddr=&d
dfc0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
dfd0: 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64   pAddr<pEnd; pAd
dfe0: 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20  dr+=2){.        
dff0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
e000: 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  pAddr);.        
e010: 20 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29    if( pc<iFree )
e020: 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72  { put2byte(pAddr
e030: 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20  , pc+sz); }.    
e040: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
e050: 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32  c<iFree2 ){ put2
e060: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
e070: 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  z2); }.        }
e080: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
e090: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20  fragment_out;.  
e0a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e0b0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
e0c0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Size;.  iCellLas
e0d0: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
e0e0: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
e0f0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
e100: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
e110: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
e120: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
e130: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
e140: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
e150: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
e160: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
e170: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
e180: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
e190: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
e1a0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f  ellLast );.    /
e1b0: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
e1c0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
e1d0: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
e1e0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
e1f0: 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d  .    ** if PRAGM
e200: 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63  A cell_size_chec
e210: 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  k=ON..    */.   
e220: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
e230: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
e240: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
e250: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e260: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
e270: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e280: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
e290: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
e2a0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70   );.    size = p
e2b0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
e2c0: 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29  pPage, &src[pc])
e2d0: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
e2e0: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
e2f0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
e300: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
e310: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
e320: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e330: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
e340: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e350: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
e360: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
e370: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
e380: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
e390: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
e3a0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
e3b0: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
e3c0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74  eSize );.    put
e3d0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
e3e0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70  k);.    if( temp
e3f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
e400: 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62   x;.      if( cb
e410: 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75  rk==pc ) continu
e420: 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20  e;.      temp = 
e430: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
e440: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
e450: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
e460: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
e470: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
e480: 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b     memcpy(&temp[
e490: 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63  x], &data[x], (c
e4a0: 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a  brk+size) - x);.
e4b0: 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70        src = temp
e4c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
e4d0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
e4e0: 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  &src[pc], size);
e4f0: 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b  .  }.  data[hdr+
e500: 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67  7] = 0;.. defrag
e510: 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 61 73 73 65  ment_out:.  asse
e520: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
e530: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 61 74  >=0 );.  if( dat
e540: 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43  a[hdr+7]+cbrk-iC
e550: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
e560: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
e570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e580: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
e590: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
e5a0: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
e5b0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
e5c0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b  ata[hdr+5], cbrk
e5d0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d  );.  data[hdr+1]
e5e0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
e5f0: 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +2] = 0;.  memse
e600: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
e610: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
e620: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
e630: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e640: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
e650: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
e660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e670: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  K;.}../*.** Sear
e680: 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  ch the free-list
e690: 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72   on page pPg for
e6a0: 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   space to store 
e6b0: 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74  a cell nByte byt
e6c0: 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49  es in.** size. I
e6d0: 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75  f one can be fou
e6e0: 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  nd, return a poi
e6f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63  nter to the spac
e700: 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a  e and remove it.
e710: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ** from the free
e720: 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -list..**.** If 
e730: 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63  no suitable spac
e740: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f  e can be found o
e750: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
e760: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
e770: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
e780: 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72  n may detect cor
e790: 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70  ruption within p
e7a0: 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69  Pg.  If corrupti
e7b0: 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65  on is.** detecte
e7c0: 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73  d then *pRc is s
e7d0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52  et to SQLITE_COR
e7e0: 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73  RUPT and NULL is
e7f0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
e800: 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72   Slots on the fr
e810: 65 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65  ee list that are
e820: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33   between 1 and 3
e830: 20 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68   bytes larger th
e840: 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c  an nByte.** will
e850: 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61   be ignored if a
e860: 64 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20  dding the extra 
e870: 73 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61  space to the fra
e880: 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74  gmentation count
e890: 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66  .** causes the f
e8a0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
e8b0: 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e  nt to exceed 60.
e8c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70  .*/.static u8 *p
e8d0: 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50  ageFindSlot(MemP
e8e0: 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42  age *pPg, int nB
e8f0: 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a  yte, int *pRc){.
e900: 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
e910: 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
e920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e930: 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
e940: 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 20  eader */.  u8 * 
e950: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
e960: 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  g->aData;       
e970: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61        /* Page da
e980: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ta */.  int iAdd
e990: 72 20 3d 20 68 64 72 20 2b 20 31 3b 20 20 20 20  r = hdr + 1;    
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
e9c0: 20 70 74 72 20 74 6f 20 70 63 20 2a 2f 0a 20 20   ptr to pc */.  
e9d0: 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
e9e0: 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29  e(&aData[iAddr])
e9f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
ea00: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 20  dress of a free 
ea10: 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 78 3b  slot */.  int x;
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 20 2f 2a 20 45 78 63 65 73 73 20 73       /* Excess s
ea50: 69 7a 65 20 6f 66 20 74 68 65 20 73 6c 6f 74 20  ize of the slot 
ea60: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 50 43 20 3d  */.  int maxPC =
ea70: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
ea80: 65 53 69 7a 65 20 2d 20 6e 42 79 74 65 3b 20 20  eSize - nByte;  
ea90: 2f 2a 20 4d 61 78 20 61 64 64 72 65 73 73 20 66  /* Max address f
eaa0: 6f 72 20 61 20 75 73 61 62 6c 65 20 73 6c 6f 74  or a usable slot
eab0: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
eaf0: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20  free slot */..  
eb00: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
eb10: 20 20 77 68 69 6c 65 28 20 70 63 3c 3d 6d 61 78    while( pc<=max
eb20: 50 43 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  PC ){.    /* EVI
eb30: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31  DENCE-OF: R-2271
eb40: 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72  0-53328 The thir
eb50: 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74  d and fourth byt
eb60: 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a  es of each.    *
eb70: 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d  * freeblock form
eb80: 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e   a big-endian in
eb90: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
eba0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
ebb0: 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  reeblock.    ** 
ebc0: 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64  in bytes, includ
ebd0: 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68  ing the 4-byte h
ebe0: 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69  eader. */.    si
ebf0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ze = get2byte(&a
ec00: 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  Data[pc+2]);.   
ec10: 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d   if( (x = size -
ec20: 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20   nByte)>=0 ){.  
ec30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
ec40: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
ec50: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
ec60: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
ec70: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
ec80: 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35  CE-OF: R-11498-5
ec90: 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66  8022 In a well-f
eca0: 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
ecb0: 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20  e, the total.   
ecc0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f       ** number o
ecd0: 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d  f bytes in fragm
ece0: 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63  ents may not exc
ecf0: 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20  eed 60. */.     
ed00: 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72     if( aData[hdr
ed10: 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20  +7]>57 ) return 
ed20: 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  0;..        /* R
ed30: 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66  emove the slot f
ed40: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
ed50: 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75  t. Update the nu
ed60: 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
ed70: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
ed80: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
ed90: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
eda0: 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41  memcpy(&aData[iA
edb0: 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d  ddr], &aData[pc]
edc0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44  , 2);.        aD
edd0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75  ata[hdr+7] += (u
ede0: 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8)x;.      }else
edf0: 20 69 66 28 20 78 2b 70 63 20 3e 20 6d 61 78 50   if( x+pc > maxP
ee00: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  C ){.        /* 
ee10: 54 68 69 73 20 73 6c 6f 74 20 65 78 74 65 6e 64  This slot extend
ee20: 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  s off the end of
ee30: 20 74 68 65 20 75 73 61 62 6c 65 20 70 61 72 74   the usable part
ee40: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
ee50: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
ee60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ee70: 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  GE(pPg);.       
ee80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
ee90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eea0: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
eeb0: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
eec0: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
eed0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
eee0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
eef0: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
ef00: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
ef10: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
ef20: 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61     put2byte(&aDa
ef30: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
ef40: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
ef50: 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78  rn &aData[pc + x
ef60: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64  ];.    }.    iAd
ef70: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20  dr = pc;.    pc 
ef80: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
ef90: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[pc]);.    if( 
efa0: 70 63 3c 3d 69 41 64 64 72 2b 73 69 7a 65 20 29  pc<=iAddr+size )
efb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 29  {.      if( pc )
efc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
efd0: 20 6e 65 78 74 20 73 6c 6f 74 20 69 6e 20 74 68   next slot in th
efe0: 65 20 63 68 61 69 6e 20 69 73 20 6e 6f 74 20 70  e chain is not p
eff0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
f000: 68 65 20 63 75 72 72 65 6e 74 20 73 6c 6f 74 20  he current slot 
f010: 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  */.        *pRc 
f020: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
f030: 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20  _PAGE(pPg);.    
f040: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
f050: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
f060: 69 66 28 20 70 63 3e 6d 61 78 50 43 2b 6e 42 79  if( pc>maxPC+nBy
f070: 74 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 54  te-4 ){.    /* T
f080: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 63 68 61  he free slot cha
f090: 69 6e 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74  in extends off t
f0a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
f0b0: 67 65 20 2a 2f 0a 20 20 20 20 2a 70 52 63 20 3d  ge */.    *pRc =
f0c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f0d0: 50 41 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 20  PAGE(pPg);.  }. 
f0e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
f0f0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
f100: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
f110: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
f120: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
f130: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
f140: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
f150: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
f160: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
f170: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
f180: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
f190: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
f1a0: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
f1b0: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
f1c0: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
f1d0: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
f1e0: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
f1f0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
f200: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
f210: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
f220: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
f230: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
f240: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
f250: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
f260: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
f270: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
f280: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
f290: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
f2a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
f2b0: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
f2c0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
f2d0: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
f2e0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
f2f0: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
f300: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
f310: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
f320: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
f330: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
f340: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
f350: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
f360: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
f370: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
f380: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
f390: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
f3a0: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
f3b0: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
f3c0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
f3d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
f3e0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
f3f0: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
f400: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
f410: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
f420: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
f430: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
f440: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
f450: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
f480: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
f490: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
f4a0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f4b0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
f4c0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
f4d0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
f4e0: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
f4f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
f500: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
f510: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
f520: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
f530: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
f540: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
f550: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
f560: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
f570: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
f580: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f590: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f5a0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f5b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
f5c0: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
f5d0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
f5e0: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
f5f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
f600: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
f610: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
f620: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
f630: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
f640: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
f650: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
f660: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f670: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
f680: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
f690: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
f6a0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
f6b0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f6c0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
f6d0: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
f6e0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f6f0: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
f700: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
f710: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
f720: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
f730: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
f740: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
f750: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
f760: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
f770: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
f780: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
f790: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
f7a0: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
f7b0: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
f7c0: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
f7d0: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
f7e0: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
f7f0: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
f800: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
f810: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
f820: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
f830: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
f840: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f850: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
f860: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
f870: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
f880: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
f890: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
f8a0: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
f8b0: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
f8c0: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
f8d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
f8e0: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
f8f0: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
f900: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f910: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f920: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
f930: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
f940: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
f950: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
f960: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
f970: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
f980: 65 6c 6c 20 70 6f 69 6e 74 65 72 2c 0a 20 20 2a  ell pointer,.  *
f990: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65  * and if the fre
f9a0: 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70  elist is not emp
f9b0: 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20  ty, then search 
f9c0: 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73  the.  ** freelis
f9d0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
f9e0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
f9f0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72  to satisfy the r
fa00: 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74  equest..  */.  t
fa10: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
fa20: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
fa30: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
fa40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
fa50: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28  ==top );.  if( (
fa60: 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64  data[hdr+2] || d
fa70: 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67  ata[hdr+1]) && g
fa80: 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20  ap+2<=top ){.   
fa90: 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61   u8 *pSpace = pa
faa0: 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65  geFindSlot(pPage
fab0: 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20  , nByte, &rc);. 
fac0: 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b     if( pSpace ){
fad0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fae0: 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28  Space>=data && (
faf0: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36  pSpace - data)<6
fb00: 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70  5536 );.      *p
fb10: 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61  Idx = (int)(pSpa
fb20: 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20  ce - data);.    
fb30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb40: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
fb50: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
fb60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
fb70: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
fb80: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
fb90: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
fba0: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
fbb0: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
fbc0: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
fbd0: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
fbe0: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
fbf0: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
fc00: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
fc10: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
fc20: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
fc30: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
fc40: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
fc50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fc60: 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a  ge->nFree>=0 );.
fc70: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
fc80: 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d  entPage(pPage, M
fc90: 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72  IN(4, pPage->nFr
fca0: 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29  ee - (2+nByte)))
fcb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
fcc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
fcd0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
fce0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
fcf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
fd00: 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20  ap+2+nByte<=top 
fd10: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
fd20: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
fd30: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
fd40: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
fd50: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
fd60: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
fd70: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
fd80: 65 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72  e btreeComputeFr
fd90: 65 65 53 70 61 63 65 28 29 20 63 61 6c 6c 20 68  eeSpace() call h
fda0: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
fdb0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
fdc0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
fdd0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
fde0: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
fdf0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
fe00: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
fe10: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
fe20: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
fe30: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
fe40: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
fe50: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
fe60: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
fe70: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
fe80: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
fe90: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
fea0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
feb0: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
fec0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
fed0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
fee0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
fef0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ff00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
ff10: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
ff20: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
ff30: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
ff40: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
ff50: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
ff60: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
ff70: 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61  ata[iStart].** a
ff80: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
ff90: 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a  he block is iSiz
ffa0: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  e bytes..**.** A
ffb0: 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63  djacent freebloc
ffc0: 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64  ks are coalesced
ffd0: 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f  ..**.** Even tho
ffe0: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
fff0: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
10000 65 64 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75  ed by btreeCompu
10010 74 65 46 72 65 65 53 70 61 63 65 28 29 2c 0a 2a  teFreeSpace(),.*
10020 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77  * that routine w
10030 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  ill not detect o
10040 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63  verlap between c
10050 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
10060 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73  ks.  Nor.** does
10070 20 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73   it detect cells
10080 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74   or freeblocks t
10090 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74  hat encrouch int
100a0 6f 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62  o the reserved b
100b0 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ytes.** at the e
100c0 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nd of the page. 
100d0 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61   So do additiona
100e0 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65  l corruption che
100f0 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a  cks inside this.
10100 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72  ** routine and r
10110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10120 52 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62  RUPT if any prob
10130 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a  lems are found..
10140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
10150 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
10160 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61  *pPage, u16 iSta
10170 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a  rt, u16 iSize){.
10180 20 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20    u16 iPtr;     
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
101b0 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78  ss of ptr to nex
101c0 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
101d0 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20   u16 iFreeBlk;  
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10200 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  s of the next fr
10210 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  eeblock */.  u8 
10220 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10240 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65     /* Page heade
10250 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30  r size.  0 or 10
10260 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20  0 */.  u8 nFrag 
10270 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10290 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61  Reduction in fra
102a0 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  gmentation */.  
102b0 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20  u16 iOrigSize = 
102c0 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
102d0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
102e0 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65  l value of iSize
102f0 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20   */.  u16 x;    
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10320 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
10330 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
10340 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72  u32 iEnd = iStar
10350 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20  t + iSize;      
10360 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
10370 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74  yte past the iSt
10380 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  art buffer */.  
10390 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
103a0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
103b0 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f  ta;   /* Page co
103c0 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
103d0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
103e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
103f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
10400 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
10410 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
10420 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
10430 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d  | iStart>=pPage-
10440 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61  >hdrOffset+6+pPa
10450 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
10470 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64  RRUPT_DB || iEnd
10480 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   <= pPage->pBt->
10490 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
104a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
104b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
104c0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
104d0 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65  .  assert( iSize
104e0 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=4 );   /* Mini
104f0 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
10500 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
10510 69 53 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70  iStart<=pPage->p
10520 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
10530 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69   );..  /* The li
10540 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
10550 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
10560 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69  nding order.  Fi
10570 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f  nd the .  ** spo
10580 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68  t on the list wh
10590 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c  ere iStart shoul
105a0 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20  d be inserted.. 
105b0 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
105c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
105d0 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  iPtr = hdr + 1;.
105e0 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b    if( data[iPtr+
105f0 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50  1]==0 && data[iP
10600 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46  tr]==0 ){.    iF
10610 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20  reeBlk = 0;  /* 
10620 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
10630 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66   case when the f
10640 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
10650 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
10660 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c   while( (iFreeBl
10670 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
10680 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72  ta[iPtr]))<iStar
10690 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  t ){.      if( i
106a0 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29  FreeBlk<iPtr+4 )
106b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46  {.        if( iF
106c0 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61  reeBlk==0 ) brea
106d0 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  k;.        retur
106e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
106f0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
10700 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72      }.      iPtr
10710 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20   = iFreeBlk;.   
10720 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65   }.    if( iFree
10730 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  Blk>pPage->pBt->
10740 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
10750 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10760 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10770 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
10780 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10790 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65  Blk>iPtr || iFre
107a0 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  eBlk==0 );.  .  
107b0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
107c0 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46  nt:.    **    iF
107d0 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20  reeBlk:   First 
107e0 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20  freeblock after 
107f0 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20  iStart, or zero 
10800 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20  if none.    **  
10810 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68    iPtr:       Th
10820 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70  e address of a p
10830 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42  ointer to iFreeB
10840 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
10850 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10860 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
10870 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
10880 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
10890 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
108a0 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
108b0 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
108c0 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
108d0 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
108e0 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
108f0 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
10900 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10910 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10920 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
10930 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
10940 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
10950 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
10960 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42  iEnd > pPage->pB
10970 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
10980 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10990 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
109a0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
109b0 20 20 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20    }.      iSize 
109c0 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b  = iEnd - iStart;
109d0 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20  .      iFreeBlk 
109e0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
109f0 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20  [iFreeBlk]);.   
10a00 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
10a10 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20  iPtr is another 
10a20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20  freeblock (that 
10a30 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e  is, if iPtr is n
10a40 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  ot the freelist.
10a50 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69      ** pointer i
10a60 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
10a70 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
10a80 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
10a90 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
10aa0 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
10ab0 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a  he end of iPtr..
10ac0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
10ad0 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20  Ptr>hdr+1 ){.   
10ae0 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d     int iPtrEnd =
10af0 20 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65   iPtr + get2byte
10b00 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b  (&data[iPtr+2]);
10b10 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45  .      if( iPtrE
10b20 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a  nd+3>=iStart ){.
10b30 20 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72          if( iPtr
10b40 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74  End>iStart ) ret
10b50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10b60 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10b70 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
10b80 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
10b90 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
10ba0 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
10bb0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
10bc0 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
10bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
10be0 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
10bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10c00 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10c10 65 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  e);.    data[hdr
10c20 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20  +7] -= nFrag;.  
10c30 7d 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65  }.  x = get2byte
10c40 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
10c50 20 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20    if( iStart<=x 
10c60 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
10c70 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
10c80 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
10c90 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
10ca0 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
10cb0 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
10cc0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
10cd0 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
10ce0 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
10cf0 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
10d00 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
10d10 28 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50  ( iStart<x || iP
10d20 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
10d30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10d40 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10d50 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
10d60 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42  a[hdr+1], iFreeB
10d70 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
10d80 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
10d90 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iEnd);.  }else{.
10da0 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
10db0 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
10dc0 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  into the freelis
10dd0 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74  t */.    put2byt
10de0 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69  e(&data[iPtr], i
10df0 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66  Start);.  }.  if
10e00 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
10e10 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
10e20 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20  T_SECURE ){.    
10e30 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
10e40 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
10e50 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
10e60 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
10e70 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e  te.    ** option
10e80 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
10e90 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
10ea0 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
10eb0 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  e);.  }.  put2by
10ec0 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  te(&data[iStart]
10ed0 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70  , iFreeBlk);.  p
10ee0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
10ef0 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
10f00 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
10f10 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
10f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
10f40 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
10f50 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
10f60 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
10f70 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
10f80 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
10f90 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
10fa0 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
10fb0 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
10fc0 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
10fd0 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
10fe0 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
10ff0 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
11000 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
11010 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
11020 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
11030 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
11040 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
11050 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
11060 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
11070 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
11080 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
11090 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
110a0 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
110b0 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
110c0 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
110d0 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
110e0 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
110f0 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
11100 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
11110 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
11120 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
11130 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
11140 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
11150 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
11160 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11170 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
11180 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
11190 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
111a0 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
111b0 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
111c0 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
111d0 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
111e0 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
111f0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11200 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
11210 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78  leaf;.  pPage->x
11220 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
11230 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20  izePtr;.  pBt = 
11240 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
11250 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
11260 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
11270 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f  INTKEY) ){.    /
11280 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11290 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76  -07291-35328 A v
112a0 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29  alue of 5 (0x05)
112b0 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
112c0 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
112d0 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72  erior table b-tr
112e0 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
112f0 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
11300 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
11310 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==5 );.    /* E
11320 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36  VIDENCE-OF: R-26
11330 39 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75  900-09176 A valu
11340 65 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d  e of 13 (0x0d) m
11350 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
11360 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74   a.    ** leaf t
11370 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
11380 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
11390 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
113a0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
113b0 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
113c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
113d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
113e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
113f0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
11400 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
11410 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
11420 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
11430 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
11440 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
11450 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  yLeaf = 0;.     
11460 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
11470 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
11480 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
11490 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
114a0 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
114b0 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
114c0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
114d0 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
114e0 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
114f0 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
11500 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
11510 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
11520 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
11530 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
11540 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d  NCE-OF: R-43316-
11550 33 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66  37308 A value of
11560 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20   2 (0x02) means 
11570 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20  the page is an. 
11580 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69     ** interior i
11590 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
115a0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
115b0 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d   (PTF_ZERODATA)=
115c0 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =2 );.    /* EVI
115d0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31  DENCE-OF: R-5961
115e0 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20  5-42828 A value 
115f0 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61  of 10 (0x0a) mea
11600 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
11610 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64  .    ** leaf ind
11620 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
11630 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11640 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
11650 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
11660 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
11670 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
11680 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
11690 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
116a0 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
116b0 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a  seCellPtrIndex;.
116c0 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
116d0 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
116e0 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
116f0 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
11700 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
11710 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  e{.    /* EVIDEN
11720 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35  CE-OF: R-47608-5
11730 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76  6469 Any other v
11740 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74  alue for the b-t
11750 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73  ree page type is
11760 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
11770 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
11780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11790 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
117a0 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74    pPage->max1byt
117b0 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e  ePayload = pBt->
117c0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b  max1bytePayload;
117d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
117e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
117f0 6d 70 75 74 65 20 74 68 65 20 61 6d 6f 75 6e 74  mpute the amount
11800 20 6f 66 20 66 72 65 65 73 70 61 63 65 20 6f 6e   of freespace on
11810 20 74 68 65 20 70 61 67 65 2e 20 20 49 6e 20 6f   the page.  In o
11820 74 68 65 72 20 77 6f 72 64 73 2c 20 66 69 6c 6c  ther words, fill
11830 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 67 65  .** in the pPage
11840 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 2e 0a 2a  ->nFree field..*
11850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
11860 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61  eeComputeFreeSpa
11870 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
11880 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  e){.  int pc;   
11890 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
118a0 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
118b0 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
118c0 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  >aData[] */.  u8
118d0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
118e0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
118f0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
11900 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
11910 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
11920 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
11930 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
11940 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
11950 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
11960 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
11970 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
11980 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
11990 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
119a0 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
119b0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  page */.  int to
119c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
119d0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
119e0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
119f0 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  rea */.  int iCe
11a00 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
11a10 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
11a20 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
11a30 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74   offset */.  int
11a40 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
11a50 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
11a60 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
11a70 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
11a80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11a90 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
11aa0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
11ab0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
11ac0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11ad0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
11ae0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
11af0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
11b00 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
11b10 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
11b20 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11b30 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
11b40 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11b50 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
11b60 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
11b70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
11b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11b90 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
11ba0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
11bb0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
11bc0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
11bd0 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 30 20 29  pPage->nFree<0 )
11be0 3b 0a 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  ;..  usableSize 
11bf0 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
11c00 61 62 6c 65 53 69 7a 65 3b 0a 20 20 68 64 72 20  ableSize;.  hdr 
11c10 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
11c20 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
11c30 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20  ge->aData;.  /* 
11c40 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
11c50 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
11c60 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
11c70 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
11c80 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  gnates.  ** the 
11c90 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
11ca0 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
11cb0 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72  A zero value for
11cc0 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73   this integer is
11cd0 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65  .  ** interprete
11ce0 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
11cf0 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
11d00 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
11d10 2b 35 5d 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72  +5]);.  iCellFir
11d20 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  st = hdr + 8 + p
11d30 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11d40 7a 65 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  ze + 2*pPage->nC
11d50 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
11d60 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
11d70 34 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  4;..  /* Compute
11d80 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
11d90 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
11da0 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  e.  ** EVIDENCE-
11db0 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35  OF: R-23588-3445
11dc0 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  0 The two-byte i
11dd0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
11de0 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a   1 gives the.  *
11df0 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66  * start of the f
11e00 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f  irst freeblock o
11e10 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69  n the page, or i
11e20 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  s zero if there 
11e30 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65  are no.  ** free
11e40 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20  blocks. */.  pc 
11e50 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
11e60 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65  [hdr+1]);.  nFre
11e70 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
11e80 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20  + top;  /* Init 
11e90 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65  nFree to non-fre
11ea0 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63  eblock free spac
11eb0 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20  e */.  if( pc>0 
11ec0 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c  ){.    u32 next,
11ed0 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70   size;.    if( p
11ee0 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  c<iCellFirst ){.
11ef0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
11f00 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
11f10 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
11f20 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
11f30 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
11f40 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
11f50 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
11f60 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  l before the fir
11f70 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20  st freeblock..  
11f80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
11f90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11fa0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20  PT_PAGE(pPage); 
11fb0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
11fc0 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( 1 ){.      if(
11fd0 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
11fe0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
11ff0 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e  block off the en
12000 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
12010 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12020 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12030 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
12040 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
12050 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
12060 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
12070 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
12080 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
12090 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
120a0 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
120b0 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
120c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
120d0 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
120e0 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29      if( next>0 )
120f0 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62  {.      /* Freeb
12100 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65  lock not in asce
12110 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
12120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12130 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
12140 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12150 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75    if( pc+size>(u
12160 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62  nsigned int)usab
12170 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
12180 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63  /* Last freebloc
12190 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70  k extends past p
121a0 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  age end */.     
121b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
121c0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
121d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
121e0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
121f0 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
12200 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
12210 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
12220 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
12230 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
12240 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
12250 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
12260 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
12270 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
12280 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
12290 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
122a0 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a  usable-size.  **
122b0 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68   of the page, th
122c0 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74  en the page must
122d0 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54   be corrupted. T
122e0 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20  his check also. 
122f0 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
12300 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
12310 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
12320 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
12330 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c  ntent.  ** area,
12340 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
12350 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
12360 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
12370 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
12380 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
12390 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
123a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
123b0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
123c0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
123d0 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
123e0 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 72 65 74  ellFirst);.  ret
123f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12400 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 64 64 69 74  ../*.** Do addit
12410 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
12420 63 6b 20 61 66 74 65 72 20 62 74 72 65 65 49 6e  ck after btreeIn
12430 69 74 50 61 67 65 28 29 20 69 66 0a 2a 2a 20 50  itPage() if.** P
12440 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
12450 63 68 65 63 6b 3d 4f 4e 20 0a 2a 2f 0a 73 74 61  check=ON .*/.sta
12460 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
12470 49 4e 45 20 69 6e 74 20 62 74 72 65 65 43 65 6c  INE int btreeCel
12480 6c 53 69 7a 65 43 68 65 63 6b 28 4d 65 6d 50 61  lSizeCheck(MemPa
12490 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
124a0 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
124b0 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
124c0 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
124d0 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
124e0 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
124f0 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
12500 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
12510 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
12520 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
12530 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12540 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
12550 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
12560 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
12570 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
12580 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 70   cell */.  int p
12590 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
125a0 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
125b0 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
125c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
125d0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
125e0 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
125f0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
12600 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
12610 7a 65 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75  ze;    /* Maximu
12620 6d 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  m usable space o
12630 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
12640 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
12650 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63     /* Start of c
12660 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
12670 20 2a 2f 0a 0a 20 20 69 43 65 6c 6c 46 69 72 73   */..  iCellFirs
12680 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
12690 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
126a0 3e 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  >nCell;.  usable
126b0 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
126c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
126d0 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
126e0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 64  bleSize - 4;.  d
126f0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
12700 74 61 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ta;.  cellOffset
12710 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
12720 66 73 65 74 3b 0a 20 20 69 66 28 20 21 70 50 61  fset;.  if( !pPa
12730 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
12740 4c 61 73 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d  Last--;.  for(i=
12750 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
12760 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 63 20  l; i++){.    pc 
12770 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
12780 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
12790 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 74 65  et+i*2]);.    te
127a0 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
127b0 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
127c0 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
127d0 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 69 66 28  lLast );.    if(
127e0 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
127f0 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
12800 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12810 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
12820 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
12830 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d  .    sz = pPage-
12840 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
12850 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
12860 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
12870 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
12880 0a 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75  .    if( pc+sz>u
12890 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
128a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
128b0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
128c0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
128d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
128e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
128f0 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
12900 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
12910 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
12920 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
12930 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
12940 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
12950 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
12960 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
12970 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
12980 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
12990 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
129a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
129b0 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
129c0 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
129d0 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
129e0 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
129f0 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
12a00 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
12a10 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
12a20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
12a30 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
12a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
12a50 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
12a60 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12a70 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
12a80 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
12a90 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
12aa0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
12ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
12ac0 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
12ad0 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  re */..  assert(
12ae0 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
12af0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12b00 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b  e->pBt->db!=0 );
12b10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12b30 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12b40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12b50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
12b60 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
12b70 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
12b80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
12b90 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
12ba0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
12bb0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
12bc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12bd0 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
12be0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
12bf0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
12c00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12c10 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a  ->isInit==0 );..
12c20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
12c30 42 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  Bt;.  data = pPa
12c40 67 65 2d 3e 61 44 61 74 61 20 2b 20 70 50 61 67  ge->aData + pPag
12c50 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
12c60 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
12c70 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68  R-28594-02890 Th
12c80 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20  e one-byte flag 
12c90 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69  at offset 0 indi
12ca0 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  cating.  ** the 
12cb0 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
12cc0 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64  . */.  if( decod
12cd0 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
12ce0 74 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65  ta[0]) ){.    re
12cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12d00 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
12d10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
12d20 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
12d30 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
12d40 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
12d50 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
12d60 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
12d70 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
12d80 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
12d90 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  0;.  pPage->cell
12da0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
12db0 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20  hdrOffset + 8 + 
12dc0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
12dd0 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ize;.  pPage->aC
12de0 65 6c 6c 49 64 78 20 3d 20 64 61 74 61 20 2b 20  ellIdx = data + 
12df0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
12e00 69 7a 65 20 2b 20 38 3b 0a 20 20 70 50 61 67 65  ize + 8;.  pPage
12e10 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 70 50 61  ->aDataEnd = pPa
12e20 67 65 2d 3e 61 44 61 74 61 20 2b 20 70 42 74 2d  ge->aData + pBt-
12e30 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
12e40 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
12e50 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b  = pPage->aData +
12e60 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
12e70 53 69 7a 65 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Size;.  /* EVIDE
12e80 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
12e90 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
12ea0 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
12eb0 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
12ec0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
12ed0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
12ee0 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e  e. */.  pPage->n
12ef0 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
12f00 26 64 61 74 61 5b 33 5d 29 3b 0a 20 20 69 66 28  &data[3]);.  if(
12f10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
12f20 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
12f30 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
12f40 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
12f50 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
12f60 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
12f70 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
12f80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
12f90 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
12fa0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
12fb0 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
12fc0 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49  pBt) );.  /* EVI
12fd0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38  DENCE-OF: R-2408
12fe0 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67  9-57979 If a pag
12ff0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
13000 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e  lls (which is on
13010 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  ly.  ** possible
13020 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65   for a root page
13030 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74   of a table that
13040 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
13050 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  s) then the.  **
13060 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
13070 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
13080 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
13090 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
130a0 74 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f  the.  ** bytes o
130b0 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  f reserved space
130c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
130d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 0a 20 20  Page->nCell>0.  
130e0 20 20 20 20 20 7c 7c 20 67 65 74 32 62 79 74 65       || get2byte
130f0 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 35 5d  NotZero(&data[5]
13100 29 3d 3d 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  )==(int)pBt->usa
13110 62 6c 65 53 69 7a 65 0a 20 20 20 20 20 20 20 7c  bleSize.       |
13120 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
13130 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
13140 20 2d 31 3b 20 20 2f 2a 20 49 6e 64 69 63 61 74   -1;  /* Indicat
13150 65 20 74 68 61 74 20 74 68 69 73 20 76 61 6c 75  e that this valu
13160 65 20 69 73 20 79 65 74 20 75 6e 63 6f 6d 70 75  e is yet uncompu
13170 74 65 64 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e  ted */.  pPage->
13180 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66  isInit = 1;.  if
13190 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
131a0 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
131b0 7a 65 43 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  zeCk ){.    retu
131c0 72 6e 20 62 74 72 65 65 43 65 6c 6c 53 69 7a 65  rn btreeCellSize
131d0 43 68 65 63 6b 28 70 50 61 67 65 29 3b 0a 20 20  Check(pPage);.  
131e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
131f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
13200 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
13210 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
13220 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
13230 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
13240 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
13250 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
13260 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
13270 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
13280 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
13290 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
132a0 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
132b0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
132c0 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
132d0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
132e0 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
132f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13300 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
13310 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
13320 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
13330 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13340 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
13350 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13360 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
13370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13380 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
13390 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
133a0 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
133b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
133c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
133d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
133e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
133f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13400 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
13410 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
13420 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43  s & BTS_FAST_SEC
13430 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  URE ){.    memse
13440 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
13450 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13460 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64   - hdr);.  }.  d
13470 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
13480 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
13490 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26  = hdr + ((flags&
134a0 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31  PTF_LEAF)==0 ? 1
134b0 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74  2 : 8);.  memset
134c0 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
134d0 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
134e0 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
134f0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
13500 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
13510 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
13520 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ee = (u16)(pBt->
13530 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
13540 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  st);.  decodeFla
13550 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
13560 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
13570 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
13580 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
13590 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73   = &data[pBt->us
135a0 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
135b0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
135c0 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70  data[first];.  p
135d0 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
135e0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
135f0 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
13600 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
13610 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
13620 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
13630 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
13640 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
13650 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
13660 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
13670 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
13680 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
13690 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
136a0 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
136b0 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
136c0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
136d0 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
136e0 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
136f0 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
13700 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
13710 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
13720 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
13730 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
13740 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
13750 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
13760 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
13770 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
13780 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
13790 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50  ;.  if( pgno!=pP
137a0 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  age->pgno ){.   
137b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
137c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
137d0 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
137e0 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
137f0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20   = pDbPage;.    
13800 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
13810 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e  ;.    pPage->pgn
13820 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50  o = pgno;.    pP
13830 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
13840 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a   pgno==1 ? 100 :
13850 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
13860 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d  ( pPage->aData==
13870 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
13880 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
13890 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
138a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
138b0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
138c0 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
138d0 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
138e0 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
138f0 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
13900 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61  f needed.  See a
13910 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75  lso: btreeGetUnu
13920 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  sedPage()..**.**
13930 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45   If the PAGER_GE
13940 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67  T_NOCONTENT flag
13950 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
13960 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
13970 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74   care.** about t
13980 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
13990 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
139a0 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
139b0 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
139c0 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
139d0 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
139e0 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
139f0 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
13a00 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
13a10 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
13a20 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
13a30 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
13a40 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
13a50 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
13a60 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
13a70 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
13a80 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
13a90 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
13aa0 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
13ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
13ac0 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
13ad0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
13ae0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
13af0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
13b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13b10 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
13b20 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
13b30 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
13b40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
13b50 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
13b60 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
13b70 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
13b80 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
13b90 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
13ba0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
13bb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
13bc0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
13bd0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c  e;..  assert( fl
13be0 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
13bf0 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e  =PAGER_GET_NOCON
13c00 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  TENT || flags==P
13c10 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
13c20 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Y );.  assert( s
13c30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13c40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13c50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
13c60 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
13c70 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
13c80 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
13c90 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
13ca0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
13cb0 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
13cc0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
13cd0 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
13ce0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13cf0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
13d00 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
13d10 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
13d20 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
13d30 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
13d40 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
13d50 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
13d60 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
13d70 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
13d80 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
13d90 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
13da0 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
13db0 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
13dc0 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
13dd0 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
13de0 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
13df0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
13e00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13e10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13e20 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
13e30 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
13e40 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
13e50 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
13e60 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
13e70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
13e80 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
13e90 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
13ea0 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
13eb0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
13ec0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
13ed0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13ee0 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
13ef0 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
13f00 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
13f10 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
13f20 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
13f30 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
13f40 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
13f50 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
13f60 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
13f70 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
13f80 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
13f90 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
13fa0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
13fb0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
13fc0 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
13fd0 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30  Page)&0x80000000
13fe0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
13ff0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
14000 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pBt);.}../*.*
14010 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
14020 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
14030 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a  initialize it..*
14040 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20  *.** If pCur!=0 
14050 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  then the page is
14060 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61   being fetched a
14070 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65  s part of a move
14080 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c  ToChild().** cal
14090 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61  l.  Do additiona
140a0 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
140b0 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e  g on the page in
140c0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41   this case..** A
140d0 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20  nd if the fetch 
140e0 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74  fails, this rout
140f0 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65  ine must decreme
14100 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a  nt pCur->iPage..
14110 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69  **.** The page i
14120 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61  s fetched as rea
14130 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70  d-write unless p
14140 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Cur is not NULL 
14150 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64  and is.** a read
14160 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a  -only cursor..**
14170 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
14180 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70  occurs, then *pp
14190 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Page is undefine
141a0 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d  d. It.** may rem
141b0 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f  ain unchanged, o
141c0 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20  r it may be set 
141d0 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61  to an invalid va
141e0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
141f0 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
14200 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
14210 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
14220 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
14230 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
14240 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14260 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
14270 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
14280 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
14290 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
142a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
142b0 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
142c0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
142d0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
142e0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
142f0 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61  o receive the pa
14300 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ge, or NULL */. 
14310 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20   int bReadOnly  
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
14340 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f  ead-only page */
14350 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
14360 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
14370 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14380 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14390 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
143a0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
143b0 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d  | ppPage==&pCur-
143c0 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
143d0 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62  rt( pCur==0 || b
143e0 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e  ReadOnly==pCur->
143f0 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b  curPagerFlags );
14400 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
14410 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  =0 || pCur->iPag
14420 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  e>0 );..  if( pg
14430 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
14440 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63  t(pBt) ){.    rc
14450 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
14460 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
14470 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
14480 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 72 63  error1;.  }.  rc
14490 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
144a0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
144b0 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
144c0 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f  &pDbPage, bReadO
144d0 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nly);.  if( rc )
144e0 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  {.    goto getAn
144f0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31  dInitPage_error1
14500 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
14510 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
14520 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
14530 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
14540 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
14550 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
14560 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
14570 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
14580 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
14590 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
145a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
145b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
145c0 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
145d0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32  dInitPage_error2
145e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
145f0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
14600 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
14610 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
14620 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
14630 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
14640 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
14650 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
14660 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
14670 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
14680 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
14690 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
146a0 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
146b0 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
146c0 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
146d0 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
146e0 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
146f0 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
14700 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
14710 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
14720 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a  UPT_PGNO(pgno);.
14730 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
14740 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32 3b 0a  nitPage_error2;.
14750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
14760 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
14770 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32 3a 0a  nitPage_error2:.
14780 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
14790 70 50 61 67 65 29 3b 0a 67 65 74 41 6e 64 49 6e  pPage);.getAndIn
147a0 69 74 50 61 67 65 5f 65 72 72 6f 72 31 3a 0a 20  itPage_error1:. 
147b0 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20   if( pCur ){.   
147c0 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
147d0 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
147e0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
147f0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
14800 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
14810 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
14820 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
14830 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
14840 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14850 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
14860 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
14870 54 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 74 68 65  T./* .** Set the
14880 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4d 65   value of the Me
14890 6d 50 61 67 65 2e 70 67 6e 6f 52 6f 6f 74 20 76  mPage.pgnoRoot v
148a0 61 72 69 61 62 6c 65 2c 20 69 66 20 69 74 20 65  ariable, if it e
148b0 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  xists..*/.static
148c0 20 76 6f 69 64 20 73 65 74 4d 65 6d 70 61 67 65   void setMempage
148d0 52 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  Root(MemPage *pP
148e0 67 2c 20 75 33 32 20 70 67 6e 6f 52 6f 6f 74 29  g, u32 pgnoRoot)
148f0 7b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 52 6f 6f  {.  pPg->pgnoRoo
14900 74 20 3d 20 70 67 6e 6f 52 6f 6f 74 3b 0a 7d 0a  t = pgnoRoot;.}.
14910 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
14920 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 78 2c  etMempageRoot(x,
14930 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  y).#endif../*.**
14940 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
14950 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
14960 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
14970 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
14980 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
14990 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  etPage..**.** Pa
149a0 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61 6c  ge1 is a special
149b0 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20 62   case and must b
149c0 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  e released using
149d0 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
149e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
149f0 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  d releasePageNot
14a00 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Null(MemPage *pP
14a10 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
14a20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
14a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
14a40 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
14a50 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
14a60 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
14a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
14a80 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
14a90 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
14aa0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
14ab0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
14ac0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
14ad0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
14ae0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
14af0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14b00 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
14b10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
14b20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
14b30 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62  tNull(pPage->pDb
14b40 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
14b50 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
14b60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
14b70 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20  {.  if( pPage ) 
14b80 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
14b90 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74 61  ll(pPage);.}.sta
14ba0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
14bb0 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65 20  PageOne(MemPage 
14bc0 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  *pPage){.  asser
14bd0 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  t( pPage!=0 );. 
14be0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
14bf0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
14c00 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
14c10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
14c20 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
14c30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14c40 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
14c50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
14c60 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
14c70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14c80 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
14c90 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
14ca0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
14cb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14cc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
14cd0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
14ce0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
14cf0 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 70  erUnrefPageOne(p
14d00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
14d10 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  }../*.** Get an 
14d20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a  unused page..**.
14d30 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
14d40 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74  st like btreeGet
14d50 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20  Page() with the 
14d60 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  addition:.**.** 
14d70 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65    *  If the page
14d80 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75   is already in u
14d90 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
14da0 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64  r purpose, immed
14db0 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72  iately.**      r
14dc0 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65  elease it and re
14dd0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
14de0 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a  URRUPT error..**
14df0 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20     *  Make sure 
14e00 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20  the isInit flag 
14e10 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74  is clear.*/.stat
14e20 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55  ic int btreeGetU
14e30 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53  nusedPage(.  BtS
14e40 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
14e50 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
14e60 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
14e70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14e80 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
14e90 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
14ea0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
14eb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
14ec0 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
14ed0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
14ee0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
14ef0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
14f00 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
14f10 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
14f20 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62  .){.  int rc = b
14f30 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
14f40 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
14f50 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
14f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14f70 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
14f80 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
14f90 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
14fa0 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
14fb0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
14fc0 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
14fd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
14fe0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14ff0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
15000 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
15010 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
15020 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
15030 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
15040 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
15050 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
15060 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
15070 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
15080 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
15090 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
150a0 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
150b0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
150c0 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
150d0 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
150e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
150f0 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
15100 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
15110 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
15120 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15130 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
15140 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
15150 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
15160 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
15170 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
15180 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
15190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
151a0 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
151b0 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
151c0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
151d0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
151e0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
151f0 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
15200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15210 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
15220 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
15230 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
15240 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
15250 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15260 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
15270 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
15280 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
15290 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
152a0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
152b0 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
152c0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
152d0 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
152e0 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
152f0 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
15300 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
15310 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
15320 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
15330 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
15340 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
15350 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
15360 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
15370 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
15380 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
15390 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
153a0 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
153b0 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
153c0 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
153d0 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
153e0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
153f0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
15400 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
15410 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
15420 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
15430 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
15440 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
15450 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
15460 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
15470 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
15480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
15490 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
154a0 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
154b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
154c0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
154d0 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
154e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
154f0 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
15500 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
15510 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
15520 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15530 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
15540 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
15550 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
15560 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
15570 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
15580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
155b0 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
155c0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  ));.}../*.** Ope
155d0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
155e0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
155f0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
15600 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15610 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
15620 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
15630 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
15640 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
15650 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
15660 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
15670 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
15680 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
15690 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
156a0 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
156b0 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
156c0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
156d0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
156e0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
156f0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
15700 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
15710 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
15720 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
15730 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
15740 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
15750 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15760 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
15770 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
15780 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
15790 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
157a0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
157b0 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
157c0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
157d0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
157e0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
157f0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
15800 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
15810 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
15820 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
15830 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
15840 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
15850 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
15860 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
15870 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
15880 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
15890 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
158a0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
158b0 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
158c0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
158d0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
158e0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
158f0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
15900 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
15910 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
15920 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
15930 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
15940 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
15950 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
15960 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
15970 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
15980 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
15990 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
159a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
159b0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
159c0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
159d0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
159e0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
159f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
15a00 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
15a10 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
15a20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
15a30 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
15a40 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
15a50 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
15a60 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
15a70 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
15a80 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
15a90 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
15aa0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15ab0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
15ac0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
15ad0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
15ae0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15af0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
15b00 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
15b10 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
15b20 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
15b30 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
15b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
15b50 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
15b60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15b70 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
15b80 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
15b90 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
15ba0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
15bb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15bc0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
15bd0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
15be0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
15bf0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
15c00 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
15c10 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
15c20 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
15c30 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
15c40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
15c50 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
15c60 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
15c70 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
15c80 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
15c90 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
15ca0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
15cb0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
15cc0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
15cd0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
15ce0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
15cf0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
15d00 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
15d10 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
15d20 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
15d30 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
15d40 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
15d50 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
15d60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
15d70 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
15d80 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
15d90 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
15da0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
15db0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
15dc0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
15dd0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
15de0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
15df0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
15e00 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
15e10 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
15e20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
15e30 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
15e40 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
15e50 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
15e60 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
15e70 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
15e80 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
15e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ea0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
15eb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
15ec0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
15ed0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
15ee0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
15ef0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
15f00 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
15f10 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
15f20 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
15f30 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
15f40 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
15f50 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
15f60 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
15f70 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
15f80 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
15f90 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
15fa0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
15fb0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
15fc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
15fd0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
15fe0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
15ff0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
16000 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
16010 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
16020 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
16030 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
16040 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
16050 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
16060 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
16070 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
16080 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
16090 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
160a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
160b0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
160c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
160d0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
160e0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
160f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16100 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
16110 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
16120 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
16130 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
16140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16150 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
16160 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
16170 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
16180 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
16190 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
161a0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
161b0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
161c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
161d0 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
161e0 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
161f0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
16200 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
16210 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
16220 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
16230 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
16240 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
16250 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
16260 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
16270 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
16280 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
16290 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
162a0 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
162b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
162c0 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
162d0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d   int nFilename =
162e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
162f0 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20  (zFilename)+1;. 
16300 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
16310 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
16320 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
16330 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
16340 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
16350 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c  Malloc(MAX(nFull
16360 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61  Pathname,nFilena
16370 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  me));.      MUTE
16380 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
16390 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
163a0 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d  red; )..      p-
163b0 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
163c0 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
163d0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
163e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
163f0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
16400 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
16410 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
16420 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
16430 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
16440 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
16450 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
16460 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
16470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
16480 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
16490 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
164a0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
164d0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
164e0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
164f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16510 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
16520 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
16530 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
16540 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16550 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
16560 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
16570 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
16580 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
16590 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
165a0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
165b0 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
165c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
165d0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
165e0 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
165f0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
16600 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
16610 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
16620 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
16630 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
16640 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
16650 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
16660 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
16670 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
16680 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
16690 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
166a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
166b0 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
166c0 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
166d0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
166e0 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
166f0 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
16700 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
16710 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
16720 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
16730 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
16740 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
16750 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
16760 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
16770 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
16780 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
16790 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
167a0 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
167b0 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
167c0 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
167d0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
167e0 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
167f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16800 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
16810 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
16820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16830 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
16840 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
16850 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16860 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
16870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
16880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
16890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
168a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
168b0 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
168c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
168d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
168e0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
168f0 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
16900 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
16910 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
16920 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
16930 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16940 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
16950 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16960 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
16970 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
16980 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
16990 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
169a0 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
169b0 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
169c0 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
169d0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
169e0 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
169f0 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
16a00 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
16a10 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
16a20 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
16a30 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
16a40 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
16a50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
16a60 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
16a70 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
16a80 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
16a90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
16aa0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
16ab0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
16ac0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
16ad0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
16ae0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
16af0 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
16b00 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
16b10 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
16b20 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
16b30 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
16b40 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
16b50 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
16b60 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
16b70 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
16b80 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
16b90 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
16ba0 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
16bb0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16bc0 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
16bd0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16be0 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
16bf0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
16c00 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
16c10 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
16c20 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
16c30 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
16c40 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
16c50 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
16c60 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
16c70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
16c80 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
16c90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
16ca0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
16cb0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
16cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
16cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
16ce0 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
16cf0 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
16d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16d10 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
16d20 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67  f(MemPage), flag
16d30 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
16d40 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
16d50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16d60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16d70 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
16d80 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
16d90 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
16da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16db0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
16dc0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
16dd0 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
16de0 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
16df0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
16e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16e10 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
16e20 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
16e30 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
16e40 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
16e50 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
16e60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16e70 74 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  tBusyHandler(pBt
16e80 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
16e90 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
16ea0 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
16eb0 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
16ec0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
16ed0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
16ee0 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
16ef0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
16f00 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
16f10 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
16f20 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
16f30 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65  ONLY;.#if define
16f40 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  d(SQLITE_SECURE_
16f50 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d  DELETE).    pBt-
16f60 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16f70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
16f80 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
16f90 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45  LITE_FAST_SECURE
16fa0 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
16fb0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16fc0 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e  S_OVERWRITE;.#en
16fd0 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  dif.    /* EVIDE
16fe0 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
16ff0 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
17000 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
17010 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
17020 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
17030 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
17040 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
17050 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
17060 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
17070 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
17080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17090 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  le. */.    pBt->
170a0 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
170b0 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
170c0 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
170d0 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
170e0 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
170f0 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
17100 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
17110 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
17120 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
17130 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
17140 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
17150 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
17160 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17170 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
17180 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
17190 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
171a0 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
171b0 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
171c0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
171d0 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
171e0 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
171f0 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
17200 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
17210 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
17220 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17230 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
17240 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
17250 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
17260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
17270 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
17280 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
17290 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
172a0 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
172b0 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
172c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
172d0 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
172e0 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
172f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17300 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
17310 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
17320 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
17330 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
17340 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
17350 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
17360 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
17370 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
17380 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
17390 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
173a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
173b0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
173c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
173d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
173e0 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
173f0 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
17400 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
17410 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  is.      ** dete
17420 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
17430 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
17440 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
17450 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
17460 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  .      ** into t
17470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17480 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
17490 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
174a0 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
174b0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
174c0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
174d0 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
174e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
174f0 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
17500 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
17510 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
17520 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
17530 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
17540 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
17550 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
17560 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
17570 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
17580 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17590 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
175a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
175b0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
175c0 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
175d0 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
175e0 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
175f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
17600 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
17610 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
17620 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
17630 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
17640 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
17650 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
17660 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
17670 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17680 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
17690 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
176a0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
176b0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
176c0 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
176d0 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
176e0 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
176f0 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
17700 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
17710 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  1;.    if( p->sh
17720 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
17730 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
17740 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
17750 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
17760 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75   MUTEX_LOGIC( mu
17770 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
17780 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
17790 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
177a0 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20  C_MASTER);).    
177b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
177c0 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
177d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
177e0 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
177f0 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
17800 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
17810 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
17820 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
17830 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
17840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
17850 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17860 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
17870 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
17880 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
17890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
178a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
178b0 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
178c0 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
178d0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
178e0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
178f0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
17900 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
17910 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
17920 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
17930 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
17940 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
17950 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
17960 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
17970 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
17980 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
17990 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
179a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
179b0 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
179c0 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
179d0 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
179e0 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
179f0 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
17a00 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
17a10 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
17a20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
17a30 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
17a40 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
17a50 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
17a60 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
17a70 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
17a80 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
17a90 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
17aa0 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
17ab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
17ac0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
17ad0 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
17ae0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
17af0 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
17b00 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
17b10 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
17b20 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
17b30 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
17b40 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e     if( (uptr)p->
17b50 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e  pBt<(uptr)pSib->
17b60 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
17b70 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
17b80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
17b90 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
17ba0 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
17bb0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
17bc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
17bd0 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
17be0 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e   && (uptr)pSib->
17bf0 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72  pNext->pBt<(uptr
17c00 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  )p->pBt ){.     
17c10 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
17c20 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
17c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17c40 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
17c50 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
17c60 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
17c70 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
17c80 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
17c90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
17ca0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
17cb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17cc0 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
17cd0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
17ce0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17cf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17d00 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
17d10 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
17d20 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
17d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17d40 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
17d50 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
17d60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
17d70 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
17d80 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
17d90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
17da0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
17db0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
17dc0 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Btree = 0;.  }el
17dd0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
17de0 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20  file *pFile;..  
17df0 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
17e00 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
17e10 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
17e20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
17e30 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
17e40 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
17e50 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
17e60 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
17e70 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
17e80 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
17e90 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
17ea0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
17eb0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
17ec0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
17ed0 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
17ee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
17ef0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
17f00 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
17f10 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
17f20 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
17f30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c  .    }..    pFil
17f40 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
17f50 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
17f60 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
17f70 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
17f80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
17f90 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69  eControlHint(pFi
17fa0 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  le, SQLITE_FCNTL
17fb0 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42  _PDB, (void*)&pB
17fc0 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  t->db);.    }.  
17fd0 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
17fe0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
17ff0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18000 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
18010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
18020 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
18030 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pen);.  }.  asse
18040 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
18050 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  K || sqlite3Btre
18060 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74  eConnectionCount
18070 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a  (*ppBtree)>0 );.
18080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18090 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
180a0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
180b0 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
180c0 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
180d0 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
180e0 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
180f0 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
18100 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
18110 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
18120 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
18130 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
18140 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
18150 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
18160 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
18170 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
18180 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
18190 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
181a0 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
181b0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
181c0 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
181d0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
181e0 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
181f0 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
18200 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
18210 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
18220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
18230 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
18240 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
18250 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
18260 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
18270 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
18280 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
18290 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
182a0 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
182b0 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
182c0 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
182d0 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
182e0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
182f0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
18300 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
18310 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
18320 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
18330 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
18340 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
18350 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
18360 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
18370 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
18380 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
18390 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
183a0 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
183b0 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
183c0 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
183d0 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
183e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
183f0 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
18400 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
18410 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
18420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18430 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
18440 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
18450 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
18460 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
18470 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
18480 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
18490 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
184a0 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
184b0 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
184c0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
184d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
184e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
184f0 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
18500 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
18510 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
18520 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
18530 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20  s with a 4-byte 
18540 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66  prefix for a lef
18550 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74  t-child.** point
18560 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
18570 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
18580 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
18590 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
185a0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
185b0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
185c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
185d0 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
185e0 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ize );..    /* O
185f0 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f  ne of the uses o
18600 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  f pBt->pTmpSpace
18610 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65   is to format ce
18620 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lls before.    *
18630 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d  * inserting them
18640 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67   into a leaf pag
18650 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  e (function fill
18660 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20  InCell()). If.  
18670 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c    ** a cell is l
18680 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73  ess than 4 bytes
18690 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20   in size, it is 
186a0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
186b0 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20  bytes.    ** by 
186c0 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74  the various rout
186d0 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75  ines that manipu
186e0 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c  late binary cell
186f0 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20  s. Which.    ** 
18700 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69  can mean that fi
18710 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
18720 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
18730 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20  first 2 or 3.   
18740 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d   ** bytes of pTm
18750 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74  pSpace, but that
18760 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
18770 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  es are copied fr
18780 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  om.    ** it int
18790 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  o a database pag
187a0 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  e. This is not a
187b0 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65  ctually a proble
187c0 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a  m, but it.    **
187d0 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61   does cause a va
187e0 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65  lgrind error whe
187f0 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74  n the 1 or 2 byt
18800 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65  es of unitialize
18810 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  d .    ** data i
18820 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74  s passed to syst
18830 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e  em call write().
18840 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69   So to avoid thi
18850 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20  s error,.    ** 
18860 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34  zero the first 4
18870 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73   bytes of temp s
18880 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a  pace here..    *
18890 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20  *.    ** Also:  
188a0 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74  Provide four byt
188b0 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65  es of initialize
188c0 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74  d space before t
188d0 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e  he.    ** beginn
188e0 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65  ing of pTmpSpace
188f0 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69   as an area avai
18900 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64  lable to prepend
18910 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
18920 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74  -child pointer t
18930 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
18940 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a  of a cell..    *
18950 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
18960 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
18970 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54    memset(pBt->pT
18980 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a  mpSpace, 0, 8);.
18990 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
189a0 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d  pace += 4;.    }
189b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
189c0 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
189d0 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
189e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
189f0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
18a00 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
18a10 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
18a20 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
18a30 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20  TmpSpace -= 4;. 
18a40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
18a50 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
18a60 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d  e);.    pBt->pTm
18a70 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  pSpace = 0;.  }.
18a80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
18a90 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
18aa0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
18ab0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
18ac0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
18ad0 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
18ae0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18af0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
18b00 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
18b10 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
18b20 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
18b30 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
18b40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18b50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
18b60 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18b70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18b80 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
18b90 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
18ba0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
18bb0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
18bc0 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
18bd0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
18be0 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
18bf0 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
18c00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
18c10 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
18c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18c30 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
18c40 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
18c50 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
18c60 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
18c70 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
18c80 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
18c90 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
18ca0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
18cb0 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
18cc0 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
18cd0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
18ce0 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
18cf0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  , 0);.  sqlite3B
18d00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
18d10 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
18d20 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
18d30 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
18d40 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
18d50 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
18d60 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
18d70 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
18d80 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
18d90 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
18da0 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
18db0 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
18dc0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
18dd0 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
18de0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
18df0 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
18e00 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
18e10 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
18e20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
18e30 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
18e40 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
18e50 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
18e60 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
18e70 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
18e80 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
18e90 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
18ea0 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
18eb0 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
18ec0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
18ed0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
18ee0 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
18ef0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
18f00 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29  ->pPager, p->db)
18f10 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
18f20 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
18f30 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
18f40 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
18f50 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
18f60 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
18f70 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
18f80 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
18f90 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
18fa0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
18fb0 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
18fc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18fd0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
18fe0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
18ff0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
19000 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
19010 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
19020 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
19030 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
19040 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
19050 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
19060 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
19070 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
19080 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
19090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
190a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
190b0 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c  nge the "soft" l
190c0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
190d0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
190e0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75  he cache..** Unu
190f0 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69  sed and unmodifi
19100 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  ed pages will be
19110 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74   recycled when t
19120 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
19130 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
19140 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20  he exceeds this 
19150 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74  soft limit.  But
19160 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
19170 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c  .** cache is all
19180 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72  owed to grow lar
19190 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69  ger than this li
191a0 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69  mit if it contai
191b0 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  ns.** dirty page
191c0 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c  s or pages still
191d0 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a   in active use..
191e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
191f0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
19200 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
19210 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
19220 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19230 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19240 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
19250 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
19260 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19270 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
19280 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
19290 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
192a0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
192b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
192c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
192d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
192e0 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20  nge the "spill" 
192f0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
19300 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
19310 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66  the cache..** If
19320 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19330 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69  ages exceeds thi
19340 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61  s limit during a
19350 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
19360 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  on,.** the pager
19370 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
19380 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20  o "spill" pages 
19390 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  to the journal e
193a0 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  arly in.** order
193b0 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
193c0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ry..**.** The va
193d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
193e0 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
193f0 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f  l size.  If zero
19400 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73   is passed.** as
19410 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f   an argument, no
19420 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
19430 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73  e to the spill s
19440 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a  ize setting, so.
19450 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20  ** using mxPage 
19460 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f  of 0 is a way to
19470 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65   query the curre
19480 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a  nt spill size..*
19490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
194a0 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42  eeSetSpillSize(B
194b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
194c0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
194d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
194e0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
194f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19500 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
19510 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
19520 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19530 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
19540 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
19550 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
19560 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
19570 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19580 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
19590 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
195a0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
195b0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
195c0 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
195d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
195e0 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
195f0 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
19600 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
19610 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
19620 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
19630 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
19640 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
19650 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19660 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19670 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
19680 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
19690 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
196a0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
196b0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
196c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
196d0 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
196e0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
196f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19700 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
19710 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
19720 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
19730 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
19740 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
19750 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
19760 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
19770 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
19780 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
19790 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
197a0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
197b0 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
197c0 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
197d0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
197e0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
197f0 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
19800 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
19810 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
19820 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
19830 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
19840 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
19850 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
19860 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
19870 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
19880 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
19890 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
198a0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
198b0 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
198c0 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
198d0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
198e0 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
198f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
19900 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
19910 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
19920 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
19930 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19940 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
19950 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
19960 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
19970 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
19980 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
19990 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
199a0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
199b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
199c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
199d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
199e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
199f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19a00 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
19a10 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
19a20 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
19a30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19a40 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19a50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19a60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
19a70 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
19a80 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
19a90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
19aa0 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
19ab0 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
19ac0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
19ad0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19ae0 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
19af0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
19b00 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
19b10 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
19b20 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
19b30 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
19b40 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
19b50 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
19b60 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
19b70 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
19b80 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
19b90 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
19ba0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
19bb0 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
19bc0 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
19bd0 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
19be0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
19bf0 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
19c00 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
19c10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19c20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
19c30 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
19c40 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
19c50 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
19c60 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
19c70 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
19c80 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
19c90 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
19ca0 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
19cb0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
19cc0 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
19cd0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
19ce0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
19cf0 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
19d00 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
19d10 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
19d20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
19d30 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
19d40 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
19d50 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
19d60 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
19d70 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
19d80 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
19d90 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
19da0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
19db0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
19dc0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
19dd0 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
19de0 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
19df0 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
19e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
19e10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19e20 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
19e30 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
19e40 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
19e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19e60 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54  er(p);.#if SQLIT
19e70 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
19e80 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e  ( nReserve>pBt->
19e90 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
19ea0 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73   pBt->optimalRes
19eb0 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65  erve = (u8)nRese
19ec0 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rve;.#endif.  if
19ed0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
19ee0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
19ef0 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
19f00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19f10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
19f20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
19f30 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
19f40 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
19f50 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
19f60 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
19f70 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
19f80 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
19f90 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
19fa0 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
19fb0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
19fc0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
19fd0 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
19fe0 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
19ff0 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
1a000 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
1a010 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
1a020 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a030 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
1a040 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
1a050 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
1a060 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
1a070 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
1a080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a090 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1a0a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1a0b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
1a0c0 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
1a0d0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
1a0e0 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
1a0f0 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
1a100 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
1a110 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
1a120 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
1a130 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a140 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1a150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a160 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
1a170 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
1a180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1a190 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
1a1a0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
1a1b0 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
1a1c0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
1a1d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a1e0 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
1a1f0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
1a200 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
1a210 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
1a220 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
1a230 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
1a240 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
1a250 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
1a260 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
1a270 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
1a280 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
1a290 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
1a2a0 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
1a2b0 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
1a2c0 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
1a2d0 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
1a2e0 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
1a2f0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
1a300 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
1a310 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
1a320 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
1a330 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a340 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
1a350 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
1a360 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
1a370 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
1a380 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
1a390 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1a3a0 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
1a3b0 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
1a3c0 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
1a3d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a3e0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
1a3f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1a400 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
1a410 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a420 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
1a430 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
1a440 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
1a450 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
1a460 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1a470 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a480 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1a490 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
1a4a0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
1a4b0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
1a4c0 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
1a4d0 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
1a4e0 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
1a4f0 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
1a500 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
1a510 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a   extensions..**.
1a520 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53  ** If SQLITE_HAS
1a530 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65  _MUTEX is define
1a540 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d then the numbe
1a550 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  r returned is th
1a560 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20  e.** greater of 
1a570 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65  the current rese
1a580 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74  rved space and t
1a590 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65  he maximum reque
1a5a0 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20  sted.** reserve 
1a5b0 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  space..*/.int sq
1a5c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74  lite3BtreeGetOpt
1a5d0 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65  imalReserve(Btre
1a5e0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
1a5f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a600 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
1a610 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
1a620 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a  erveNoMutex(p);.
1a630 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
1a640 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c  S_CODEC.  if( n<
1a650 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
1a660 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e  eserve ) n = p->
1a670 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
1a680 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rve;.#endif.  sq
1a690 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a6a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
1a6b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
1a6c0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
1a6d0 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
1a6e0 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
1a6f0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
1a700 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
1a710 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
1a720 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
1a730 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
1a740 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
1a750 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
1a760 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
1a770 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1a780 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
1a790 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
1a7a0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
1a7b0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
1a7c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
1a7d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1a7e0 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
1a7f0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
1a800 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1a810 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1a820 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
1a830 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
1a840 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45  s for the BTS_SE
1a850 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20  CURE_DELETE and 
1a860 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  BTS_OVERWRITE fl
1a870 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65  ags:.**.**    ne
1a880 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42  wFlag==0       B
1a890 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44  oth BTS_SECURE_D
1a8a0 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56  ELETE and BTS_OV
1a8b0 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65 61  ERWRITE are clea
1a8c0 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  red.**    newFla
1a8d0 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53  g==1       BTS_S
1a8e0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74  ECURE_DELETE set
1a8f0 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
1a900 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a  TE is cleared.**
1a910 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20      newFlag==2  
1a920 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f       BTS_SECURE_
1a930 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61  DELETE cleared a
1a940 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
1a950 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65   is set.**    ne
1a960 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e  wFlag==(-1)    N
1a970 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20  o changes.**.** 
1a980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
1a990 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66 20  s as a query if 
1a9a0 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20  newFlag is less 
1a9b0 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20  than zero.**.** 
1a9c0 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49  With BTS_OVERWRI
1a9d0 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20  TE set, deleted 
1a9e0 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77  content is overw
1a9f0 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c  ritten by zeros,
1aa00 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74   but.** freelist
1aa10 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
1aa20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b  not written back
1aa30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1aa40 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a  .  Thus in-page.
1aa50 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  ** deleted conte
1aa60 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62  nt is cleared, b
1aa70 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65  ut freelist dele
1aa80 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ted content is n
1aa90 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42  ot..**.** With B
1aaa0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
1aab0 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c  , operation is l
1aac0 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54  ike BTS_OVERWRIT
1aad0 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  E with the addit
1aae0 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65  ion.** that free
1aaf0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
1ab00 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b  are written back
1ab10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1ab20 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a  se, increasing.*
1ab30 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  * the amount of 
1ab40 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74  disk I/O..*/.int
1ab50 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
1ab60 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
1ab70 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
1ab80 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
1ab90 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
1aba0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1abb0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1abc0 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54  rt( BTS_OVERWRIT
1abd0 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45  E==BTS_SECURE_DE
1abe0 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65  LETE*2 );.  asse
1abf0 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43  rt( BTS_FAST_SEC
1ac00 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52  URE==(BTS_OVERWR
1ac10 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44  ITE|BTS_SECURE_D
1ac20 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20  ELETE) );.  if( 
1ac30 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
1ac40 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
1ac50 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f  gs &= ~BTS_FAST_
1ac60 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70  SECURE;.    p->p
1ac70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1ac80 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
1ac90 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20  E*newFlag;.  }. 
1aca0 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
1acb0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
1acc0 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45  T_SECURE)/BTS_SE
1acd0 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73  CURE_DELETE;.  s
1ace0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1acf0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
1ad00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1ad10 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
1ad20 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
1ad30 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
1ad40 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
1ad50 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1ad60 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1ad70 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
1ad80 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
1ad90 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
1ada0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
1adb0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
1adc0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
1add0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
1ade0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1adf0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1ae00 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
1ae10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ae20 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
1ae30 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
1ae40 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
1ae50 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1ae60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
1ae70 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
1ae80 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
1ae90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1aea0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1aeb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
1aec0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
1aed0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
1aee0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1aef0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1af00 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
1af10 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
1af20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
1af30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1af40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1af50 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
1af60 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
1af70 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
1af80 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
1af90 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
1afa0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
1afb0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1afc0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
1afd0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
1afe0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
1aff0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
1b000 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
1b010 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
1b020 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
1b030 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1b040 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
1b050 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
1b060 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1b070 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1b080 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1b090 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
1b0a0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
1b0b0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
1b0c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b0d0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
1b0e0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
1b0f0 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
1b100 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
1b110 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
1b120 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
1b130 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
1b140 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
1b150 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
1b160 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b170 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b180 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
1b190 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  /*.** If the use
1b1a0 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68  r has not set th
1b1b0 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66  e safety-level f
1b1c0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1b1d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75   connection.** u
1b1e0 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e  sing "PRAGMA syn
1b1f0 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69  chronous", and i
1b200 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  f the safety-lev
1b210 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  el is not alread
1b220 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  y.** set to the 
1b230 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  value passed to 
1b240 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
1b250 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1b260 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74  meter,.** set it
1b270 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49   so..*/.#if SQLI
1b280 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
1b290 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44  RONOUS!=SQLITE_D
1b2a0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
1b2b0 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26 20  RONOUS \.    && 
1b2c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b2d0 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69 63  OMIT_WAL).static
1b2e0 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c 74   void setDefault
1b2f0 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72 65  SyncFlag(BtShare
1b300 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65 74  d *pBt, u8 safet
1b310 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69  y_level){.  sqli
1b320 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 70  te3 *db;.  Db *p
1b330 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70 42  Db;.  if( (db=pB
1b340 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44  t->db)!=0 && (pD
1b350 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b  b=db->aDb)!=0 ){
1b360 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d  .    while( pDb-
1b370 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e  >pBt==0 || pDb->
1b380 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b  pBt->pBt!=pBt ){
1b390 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69 66   pDb++; }.    if
1b3a0 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d  ( pDb->bSyncSet=
1b3b0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62 2d  =0 .     && pDb-
1b3c0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 73  >safety_level!=s
1b3d0 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20 20  afety_level .   
1b3e0 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e 61    && pDb!=&db->a
1b3f0 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20 20  Db[1] .    ){.  
1b400 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
1b410 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f 6c  level = safety_l
1b420 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  evel;.      sqli
1b430 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
1b440 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20  (pBt->pPager,.  
1b450 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
1b460 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d  ety_level | (db-
1b470 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  >flags & PAGER_F
1b480 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20  LAGS_MASK));.   
1b490 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
1b4a0 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61 75   define setDefau
1b4b0 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 73  ltSyncFlag(pBt,s
1b4c0 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65 6e  afety_level).#en
1b4d0 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  dif../* Forward 
1b4e0 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
1b4f0 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
1b500 61 62 61 73 65 28 42 74 53 68 61 72 65 64 2a 29  abase(BtShared*)
1b510 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  ;.../*.** Get a 
1b520 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
1b530 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
1b540 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
1b550 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
1b560 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
1b570 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
1b580 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1b590 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1b5a0 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
1b5b0 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
1b5c0 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
1b5d0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
1b5e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
1b5f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
1b600 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1b610 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
1b620 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
1b630 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
1b640 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
1b650 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
1b660 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
1b670 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
1b680 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1b690 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b6a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1b6b0 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
1b6c0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
1b6d0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
1b6e0 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
1b6f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b700 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 3b   */.  u32 nPage;
1b710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b720 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1b730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1b740 0a 20 20 75 33 32 20 6e 50 61 67 65 46 69 6c 65  .  u32 nPageFile
1b750 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
1b760 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1b770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b780 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 48 65  */.  u32 nPageHe
1b790 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
1b7a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1b7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
1b7c0 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
1b7d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1b7e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b7f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1b800 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1b810 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
1b820 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
1b830 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
1b840 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
1b850 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b860 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
1b870 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1b880 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
1b890 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b8a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b8b0 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
1b8c0 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
1b8d0 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
1b8e0 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
1b8f0 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
1b900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b910 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
1b920 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65  nPageHeader = ge
1b930 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1b940 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1b950 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1b960 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1b970 65 72 2c 20 28 69 6e 74 2a 29 26 6e 50 61 67 65  er, (int*)&nPage
1b980 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
1b990 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
1b9a0 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
1b9b0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
1b9c0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
1b9d0 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
1b9e0 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
1b9f0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d  .  if( (pBt->db-
1ba00 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1ba10 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21 3d  ResetDatabase)!=
1ba20 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
1ba30 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50   0;.  }.  if( nP
1ba40 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
1ba50 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
1ba60 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
1ba70 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
1ba80 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
1ba90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1baa0 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
1bab0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
1bac0 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
1bad0 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
1bae0 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
1baf0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
1bb00 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
1bb10 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
1bb20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
1bb30 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
1bb40 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
1bb50 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
1bb60 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
1bb70 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
1bb80 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
1bb90 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1bba0 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
1bbb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1bbc0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
1bbd0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
1bbe0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1bbf0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
1bc00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
1bc10 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
1bc20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1bc30 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1bc40 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
1bc50 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
1bc60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1bc70 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
1bc80 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
1bc90 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
1bca0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1bcb0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1bcc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1bcd0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
1bce0 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
1bcf0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
1bd00 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
1bd10 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
1bd20 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
1bd30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1bd40 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
1bd50 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
1bd60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
1bd70 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
1bd80 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
1bd90 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
1bda0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
1bdb0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
1bdc0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
1bdd0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
1bde0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
1bdf0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
1be00 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
1be10 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
1be20 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
1be30 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
1be40 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
1be50 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
1be60 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
1be70 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
1be80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1be90 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
1bea0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1beb0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
1bec0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
1bed0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
1bee0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1bef0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
1bf00 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
1bf10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1bf20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bf30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1bf40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
1bf50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bf60 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
1bf70 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
1bf80 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
1bf90 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20  RONOUS+1);.     
1bfa0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30     if( isOpen==0
1bfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1bfc0 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61  leasePageOne(pPa
1bfd0 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge1);.          
1bfe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c000 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
1c010 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
1c020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1c030 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
1c040 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
1c050 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55  FAULT_SYNCHRONOU
1c060 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  S+1);.    }.#end
1c070 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  if..    /* EVIDE
1c080 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d  NCE-OF: R-15465-
1c090 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75  20813 The maximu
1c0a0 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d  m and minimum em
1c0b0 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20  bedded payload. 
1c0c0 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20     ** fractions 
1c0d0 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79  and the leaf pay
1c0e0 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61  load fraction va
1c0f0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c  lues must be 64,
1c100 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20   32, and 32..   
1c110 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
1c120 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
1c130 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
1c140 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
1c150 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
1c160 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
1c170 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
1c180 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
1c190 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
1c1a0 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
1c1b0 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
1c1c0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
1c1d0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1c1e0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1c1f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
1c200 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
1c210 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
1c220 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
1c230 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
1c240 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
1c250 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
1c260 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
1c270 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
1c280 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
1c290 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
1c2a0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1c2b0 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65  pageSize = (page
1c2c0 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67  1[16]<<8) | (pag
1c2d0 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  e1[17]<<16);.   
1c2e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c2f0 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54   R-25008-21688 T
1c300 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  he size of a pag
1c310 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  e is a power of 
1c320 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65  two.    ** betwe
1c330 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
1c340 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20   inclusive. */. 
1c350 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
1c360 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
1c370 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69  0.     || pageSi
1c380 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
1c390 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c  GE_SIZE .     ||
1c3a0 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a   pageSize<=256 .
1c3b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
1c3c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1c3d0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
1c3e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1c3f0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
1c400 45 44 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ED;.    assert( 
1c410 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
1c420 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  0 );.    /* EVID
1c430 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30  ENCE-OF: R-59310
1c440 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65  -51205 The "rese
1c450 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65  rved space" size
1c460 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20   in the 1-byte. 
1c470 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74     ** integer at
1c480 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68   offset 20 is th
1c490 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1c4a0 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
1c4b0 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20  e end of.    ** 
1c4c0 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73  each page to res
1c4d0 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69  erve for extensi
1c4e0 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ons. .    **.   
1c4f0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1c500 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
1c510 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
1c520 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
1c530 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
1c540 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
1c550 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
1c560 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
1c570 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
1c580 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
1c590 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
1c5a0 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c  er. */.    usabl
1c5b0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1c5c0 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
1c5d0 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
1c5e0 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
1c5f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
1c600 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
1c610 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1c620 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
1c630 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
1c640 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
1c650 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
1c660 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
1c670 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
1c680 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
1c690 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
1c6a0 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
1c6b0 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
1c6c0 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
1c6d0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
1c6e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c6f0 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
1c700 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
1c710 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
1c720 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
1c730 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
1c740 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c750 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
1c760 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
1c770 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
1c780 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
1c790 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
1c7a0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
1c7b0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
1c7c0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
1c7d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1c7e0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
1c7f0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
1c800 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
1c830 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
1c840 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
1c860 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68  lite3WritableSch
1c870 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d 3d 30 20  ema(pBt->db)==0 
1c880 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
1c890 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
1c8a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c8b0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
1c8c0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1c8d0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1c8e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c8f0 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
1c900 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
1c910 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
1c920 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
1c930 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
1c940 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c950 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
1c960 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
1c970 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
1c980 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
1c990 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
1c9a0 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
1c9b0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
1c9c0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1c9d0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1c9e0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
1c9f0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
1ca00 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
1ca10 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
1ca20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ca30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ca40 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
1ca50 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
1ca60 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
1ca70 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
1ca80 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
1ca90 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
1caa0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
1cab0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
1cac0 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
1cad0 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
1cae0 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
1caf0 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
1cb00 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
1cb10 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
1cb20 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
1cb30 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
1cb40 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
1cb50 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
1cb60 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
1cb70 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
1cb80 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
1cb90 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
1cba0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
1cbb0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
1cbc0 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
1cbd0 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
1cbe0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
1cbf0 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
1cc00 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
1cc10 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
1cc20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
1cc30 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
1cc40 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
1cc50 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
1cc60 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
1cc70 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
1cc80 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
1cc90 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
1cca0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
1ccb0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
1ccc0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
1ccd0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
1cce0 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
1ccf0 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
1cd00 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
1cd10 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
1cd20 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
1cd30 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
1cd40 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
1cd50 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
1cd60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
1cd70 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
1cd80 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
1cd90 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
1cda0 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
1cdb0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
1cdc0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1cdd0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
1cde0 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
1cdf0 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
1ce00 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
1ce10 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
1ce20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ce30 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
1ce40 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
1ce50 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
1ce60 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
1ce70 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
1ce80 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
1ce90 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
1cea0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
1ceb0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1cec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ced0 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
1cee0 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
1cef0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
1cf00 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
1cf10 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1cf20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
1cf30 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
1cf40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
1cf50 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42  rsors open on pB
1cf60 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  t. This is for u
1cf70 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
1cf80 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
1cf90 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
1cfa0 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
1cfb0 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
1cfc0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72  d..**.** Only wr
1cfd0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
1cfe0 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c  counted if wrOnl
1cff0 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77  y is true.  If w
1d000 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73  rOnly is.** fals
1d010 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  e then all curso
1d020 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a  rs are counted..
1d030 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
1d040 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
1d050 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72  outine, a cursor
1d060 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
1d070 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
1d080 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20  e of reading or 
1d090 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
1d0a0 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72  atabase.  Cursor
1d0b0 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62  s that.** have b
1d0c0 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f  een tripped into
1d0d0 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c   the CURSOR_FAUL
1d0e0 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20  T state are not 
1d0f0 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  counted..*/.stat
1d100 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69  ic int countVali
1d110 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  dCursors(BtShare
1d120 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e  d *pBt, int wrOn
1d130 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
1d140 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
1d150 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
1d160 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
1d170 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
1d180 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77  ext){.    if( (w
1d190 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75  rOnly==0 || (pCu
1d1a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
1d1b0 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30  CF_WriteFlag)!=0
1d1c0 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  ).     && pCur->
1d1d0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
1d1e0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
1d1f0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
1d200 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
1d210 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
1d220 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
1d230 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
1d240 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
1d250 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1d260 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
1d270 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1d280 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
1d290 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1d2a0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
1d2b0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
1d2c0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
1d2d0 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
1d2e0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
1d2f0 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
1d300 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
1d310 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
1d320 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
1d330 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1d340 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1d350 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
1d360 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
1d370 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
1d380 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d390 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d3a0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1d3b0 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1d3c0 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70  s(pBt,0)==0 || p
1d3d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d3e0 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
1d3f0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
1d400 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d410 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
1d420 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65  ge1!=0 ){.    Me
1d430 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1d440 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
1d450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d   assert( pPage1-
1d460 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
1d470 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1d480 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
1d490 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
1d4a0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1d4b0 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
1d4c0 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20  geOne(pPage1);. 
1d4d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
1d4e0 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
1d4f0 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
1d500 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
1d510 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
1d520 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
1d530 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
1d540 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
1d550 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
1d560 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1d570 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
1d580 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
1d590 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
1d5a0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1d5b0 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
1d5c0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
1d5d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1d5e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1d5f0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1d600 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1d610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d620 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
1d630 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
1d640 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
1d650 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
1d660 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d670 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
1d680 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
1d690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
1d6a0 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
1d6b0 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
1d6c0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
1d6d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1d6e0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
1d6f0 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
1d700 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
1d710 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
1d720 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
1d730 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
1d740 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
1d750 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
1d760 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
1d770 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
1d780 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
1d790 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
1d7a0 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
1d7b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
1d7c0 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
1d7d0 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
1d7e0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
1d7f0 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
1d800 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
1d810 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
1d820 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
1d830 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
1d840 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
1d850 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
1d860 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
1d870 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
1d880 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1d890 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
1d8a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1d8b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d8c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1d8d0 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
1d8e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1d8f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1d900 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1d910 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
1d920 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
1d930 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
1d940 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
1d950 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
1d960 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
1d970 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
1d980 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
1d990 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
1d9a0 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
1d9b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d9c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1d9d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69  nitialize the fi
1d9e0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1d9f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63  database file (c
1da00 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61  reating a databa
1da10 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67  se.** consisting
1da20 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
1da30 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20  e and no schema 
1da40 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e  objects). Return
1da50 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
1da60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
1da70 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1da80 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
1da90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1daa0 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a  reeNewDb(Btree *
1dab0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1dac0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1dad0 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
1dae0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20  nPage = 0;.  rc 
1daf0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d  = newDatabase(p-
1db00 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pBt);.  sqlite3
1db10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1db20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1db30 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1db40 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
1db50 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
1db60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
1db70 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
1db80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1db90 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
1dba0 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
1dbb0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1dbc0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
1dbd0 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
1dbe0 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
1dbf0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
1dc00 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
1dc10 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
1dc20 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
1dc30 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
1dc40 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
1dc50 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
1dc60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
1dc70 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
1dc80 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
1dc90 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
1dca0 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
1dcb0 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
1dcc0 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
1dcd0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
1dce0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1dcf0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
1dd00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1dd10 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
1dd20 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
1dd30 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
1dd40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1dd50 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
1dd60 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1dd70 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
1dd80 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
1dd90 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
1dda0 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
1ddb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
1ddc0 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
1ddd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1dde0 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
1ddf0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1de00 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
1de10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1de20 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
1de30 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1de40 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
1de50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
1de60 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
1de70 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
1de80 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
1de90 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
1dea0 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
1deb0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
1dec0 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
1ded0 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
1dee0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
1def0 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
1df00 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
1df10 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1df20 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
1df30 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
1df40 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
1df50 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
1df60 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
1df70 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1df80 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
1df90 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
1dfa0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
1dfb0 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
1dfc0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1dfd0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
1dfe0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
1dff0 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
1e000 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
1e010 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
1e020 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
1e030 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
1e040 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
1e050 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
1e060 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1e070 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
1e080 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
1e090 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
1e0a0 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
1e0b0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
1e0c0 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
1e0d0 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
1e0e0 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
1e0f0 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
1e100 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
1e110 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
1e120 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
1e130 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
1e140 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
1e150 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
1e160 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1e170 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
1e180 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
1e190 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
1e1a0 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
1e1b0 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
1e1c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1e1d0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1e1e0 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
1e1f0 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53 63  wrflag, int *pSc
1e200 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20 20  hemaVersion){.  
1e210 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e220 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
1e230 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e240 69 6e 74 20 62 43 6f 6e 63 75 72 72 65 6e 74 20  int bConcurrent 
1e250 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63 75  = (p->db->bConcu
1e260 72 72 65 6e 74 20 26 26 20 21 49 53 41 55 54 4f  rrent && !ISAUTO
1e270 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73 71 6c 69  VACUUM);..  sqli
1e280 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1e290 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1e2a0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1e2b0 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
1e2c0 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
1e2d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
1e2e0 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
1e2f0 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
1e300 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
1e310 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
1e320 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
1e330 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
1e340 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1e350 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1e360 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
1e370 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
1e380 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
1e390 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1e3a0 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
1e3b0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1e3c0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1e3d0 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
1e3e0 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
1e3f0 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  cate)==0 );..  i
1e400 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  f( (p->db->flags
1e410 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44   & SQLITE_ResetD
1e420 61 74 61 62 61 73 65 29 20 0a 20 20 20 26 26 20  atabase) .   && 
1e430 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
1e440 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
1e450 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20  er)==0 .  ){.   
1e460 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1e470 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  = ~BTS_READ_ONLY
1e480 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1e490 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1e4a0 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1e4b0 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1e4c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1e4d0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1e4e0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1e4f0 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1e500 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1e510 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1e520 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1e530 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1e540 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1e550 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1e560 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1e570 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1e580 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1e590 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1e5a0 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1e5b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1e5c0 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1e5d0 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1e5e0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1e5f0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1e600 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1e610 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1e620 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1e630 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1e640 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1e650 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e660 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1e670 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1e680 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1e690 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1e6a0 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1e6b0 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1e6c0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1e6d0 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1e6e0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1e6f0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1e700 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1e710 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1e720 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1e730 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1e740 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1e750 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1e760 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1e770 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e780 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e790 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1e7a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1e7b0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1e7c0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1e7d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e7e0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1e7f0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1e800 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1e810 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1e820 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1e830 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1e840 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1e850 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1e860 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1e870 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1e880 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1e890 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1e8a0 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1e8b0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1e8c0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1e8d0 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1e8e0 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1e8f0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1e900 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1e910 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1e920 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1e930 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1e940 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1e950 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1e960 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1e970 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1e980 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1e990 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1e9a0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1e9b0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1e9c0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1e9d0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1e9e0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1e9f0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1ea00 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1ea10 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1ea20 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1ea30 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1ea40 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1ea50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1ea60 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1ea70 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1ea80 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1ea90 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1eaa0 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1eab0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1eac0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1ead0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1eae0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1eaf0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1eb00 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1eb10 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1eb20 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1eb30 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1eb40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1eb50 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1eb60 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1eb70 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1eb80 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1eb90 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1eba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ebb0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1ebc0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1ebd0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1ebe0 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1ebf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1ec00 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1ec10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1ec20 20 65 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63 75   exFlag = bConcu
1ec30 72 72 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77 72  rrent ? -1 : (wr
1ec40 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
1ec50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ec60 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
1ec70 67 65 72 2c 20 65 78 46 6c 61 67 2c 20 73 71 6c  ger, exFlag, sql
1ec80 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
1ec90 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1eca0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ecb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ecc0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1ecd0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1ece0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1ecf0 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
1ed00 4f 54 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  OT && pBt->inTra
1ed10 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1ed20 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
1ed30 20 20 2f 2a 20 69 66 20 74 68 65 72 65 20 77 61    /* if there wa
1ed40 73 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  s no transaction
1ed50 20 6f 70 65 6e 65 64 20 77 68 65 6e 20 74 68 69   opened when thi
1ed60 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 0a 20  s function was. 
1ed70 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c           ** call
1ed80 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  ed and SQLITE_BU
1ed90 53 59 5f 53 4e 41 50 53 48 4f 54 20 69 73 20 72  SY_SNAPSHOT is r
1eda0 65 74 75 72 6e 65 64 2c 20 63 68 61 6e 67 65 20  eturned, change 
1edb0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1edc0 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 53      ** code to S
1edd0 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20  QLITE_BUSY. */. 
1ede0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1edf0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1ee00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ee10 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
1ee20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ee30 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
1ee40 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1ee50 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
1ee60 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
1ee70 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
1ee80 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ee90 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
1eea0 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
1eeb0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
1eec0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
1eed0 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f  erResetLockTimeo
1eee0 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ut(pBt->pPager);
1eef0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1ef00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1ef10 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ef20 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1ef30 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1ef40 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
1ef50 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1ef60 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
1ef70 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
1ef80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ef90 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
1efa0 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
1efb0 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
1efc0 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
1efd0 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
1efe0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
1eff0 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1f000 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
1f010 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
1f020 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1f030 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
1f040 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
1f050 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
1f060 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
1f070 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
1f080 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1f090 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1f0a0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
1f0b0 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
1f0c0 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1f0d0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
1f0e0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1f0f0 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
1f100 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1f110 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
1f120 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
1f130 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
1f140 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
1f150 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1f160 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
1f170 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
1f180 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
1f190 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
1f1a0 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
1f1b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1f1c0 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
1f1d0 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
1f1e0 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
1f1f0 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
1f200 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
1f210 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
1f220 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
1f230 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
1f240 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
1f250 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
1f260 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
1f270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f280 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
1f290 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
1f2a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f2b0 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
1f2c0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
1f2d0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
1f2e0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
1f2f0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1f300 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1f310 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1f320 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
1f330 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1f340 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
1f350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f360 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1f370 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f3a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1f3b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1f3c0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1f3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f3e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73      }.  }..trans
1f3f0 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66 20  _begun:.#ifndef 
1f400 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
1f410 55 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43 6f  URRENT.  if( bCo
1f420 6e 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d 3d  ncurrent && rc==
1f430 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
1f440 69 74 65 33 50 61 67 65 72 49 73 57 61 6c 28 70  ite3PagerIsWal(p
1f450 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1f460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f470 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72 72  agerBeginConcurr
1f480 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ent(pBt->pPager)
1f490 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f4a0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1f4b0 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1f4c0 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
1f4d0 61 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ate(pBt);.    }.
1f4e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
1f4f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f500 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  ){.    if( pSche
1f510 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  maVersion ){.   
1f520 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69     *pSchemaVersi
1f530 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  on = get4byte(&p
1f540 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f550 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  a[40]);.    }.  
1f560 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1f570 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1f580 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1f590 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1f5a0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1f5b0 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ber of.      ** 
1f5c0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1f5d0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1f5e0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1f5f0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1f600 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d       ** the sub-
1f610 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1f620 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1f630 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1f640 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ned here..      
1f650 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 61  */.      int nSa
1f660 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 64 62 2d  vepoint = p->db-
1f670 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >nSavepoint;.   
1f680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f690 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1f6a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
1f6b0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1f6c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f6d0 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69 6e  _OK && nSavepoin
1f6e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
1f6f0 3d 20 62 74 72 65 65 50 74 72 6d 61 70 42 65 67  = btreePtrmapBeg
1f700 69 6e 28 70 42 74 2c 20 6e 53 61 76 65 70 6f 69  in(pBt, nSavepoi
1f710 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
1f720 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49   }.  }..  btreeI
1f730 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1f740 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f750 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1f760 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1f770 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f780 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1f790 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1f7a0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1f7b0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1f7c0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1f7d0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1f7e0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1f7f0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1f800 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1f810 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1f820 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1f830 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1f840 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1f850 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1f860 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1f870 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1f8a0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1f8b0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f8e0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1f8f0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1f900 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f920 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1f930 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f940 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1f950 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1f960 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1f970 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f980 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1f990 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1f9a0 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  c = pPage->isIni
1f9b0 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
1f9c0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1f9d0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1f9e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1f9f0 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rn rc;.  nCell =
1fa00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1fa10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1fa20 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1fa30 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1fa40 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1fa50 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1fa60 50 74 72 28 70 50 61 67 65 2c 20 70 50 61 67 65  Ptr(pPage, pPage
1fa70 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1fa80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1fa90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1faa0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1fab0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1fac0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1fad0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1fae0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1faf0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1fb00 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1fb10 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1fb20 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1fb30 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1fb40 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1fb50 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1fb60 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1fb70 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1fb80 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1fb90 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc);.  }..  retu
1fba0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fbb0 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1fbc0 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1fbd0 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1fbe0 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1fbf0 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1fc00 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1fc10 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1fc20 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1fc30 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1fc40 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1fc50 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1fc60 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1fc70 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1fc80 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1fc90 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1fca0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1fcd0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1fce0 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1fcf0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1fd00 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1fd10 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1fd20 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1fd30 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1fd40 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1fd50 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1fd60 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1fd70 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1fd80 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1fd90 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1fda0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1fdb0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1fdd0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1fde0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1fdf0 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1fe00 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1fe10 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1fe20 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1fe30 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1fe40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1fe50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1fe60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1fe70 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1fe80 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1fe90 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1fea0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1feb0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1fec0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1fed0 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1fee0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1fef0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1ff00 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1ff10 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1ff20 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1ff30 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1ff40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1ff50 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1ff60 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
1ff70 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1ff80 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
1ff90 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1ffa0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  nt nCell;.    in
1ffb0 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20  t rc;..    rc = 
1ffc0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20  pPage->isInit ? 
1ffd0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65  SQLITE_OK : btre
1ffe0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1fff0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
20000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
20010 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
20020 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
20030 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
20040 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
20050 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
20060 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
20070 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
20080 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
20090 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
200a0 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
200b0 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
200c0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
200d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
200e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
200f0 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
20100 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b        if( pCell+
20110 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61  info.nSize > pPa
20120 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
20130 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
20140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20160 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
20170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20180 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
20190 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65  om==get4byte(pCe
201a0 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29  ll+info.nSize-4)
201b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
201c0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  put4byte(pCell+i
201d0 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f  nfo.nSize-4, iTo
201e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
201f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
20200 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20220 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
20230 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
20240 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
20250 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
20260 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
20270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20280 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
20290 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
202a0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
202b0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
202c0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
202d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
202e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
202f0 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
20300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20310 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
20320 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
20330 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
20340 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
20350 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
20360 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
20370 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
20380 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
20390 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
203a0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
203b0 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
203c0 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
203d0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
203e0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
203f0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
20400 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
20410 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
20420 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
20430 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
20440 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
20450 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
20460 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
20470 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
20480 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
20490 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
204a0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
204b0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
204c0 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
204d0 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
204e0 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
204f0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
20500 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
20510 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
20520 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
20530 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
20540 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
20550 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
20560 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20580 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
20590 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
205a0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
205b0 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
205c0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
205d0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
205e0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
205f0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
20600 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
20610 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
20620 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
20630 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
20640 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
20650 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
20660 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
20670 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
20680 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
20690 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
206a0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
206b0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
206c0 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
206d0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
206e0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
206f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
20700 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
20710 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
20720 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
20730 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
20740 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
20750 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
20760 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
20770 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
20780 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
20790 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
207a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
207b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
207c0 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
207d0 74 3d 3d 70 42 74 20 29 3b 0a 20 20 69 66 28 20  t==pBt );.  if( 
207e0 69 44 62 50 61 67 65 3c 33 20 29 20 72 65 74 75  iDbPage<3 ) retu
207f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20800 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f  T_BKPT;..  /* Mo
20810 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
20820 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
20830 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
20840 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
20850 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
20860 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
20870 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
20880 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
20890 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
208a0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
208b0 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
208c0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
208d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
208e0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
208f0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
20900 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
20910 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
20920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20930 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20940 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
20950 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
20960 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
20970 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
20980 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
20990 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
209a0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
209b0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
209c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
209d0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
209e0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
209f0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
20a00 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
20a10 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
20a20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
20a30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
20a40 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
20a50 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
20a60 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
20a70 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
20a80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
20a90 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
20aa0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
20ab0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
20ac0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
20ad0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
20ae0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
20af0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
20b00 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
20b10 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
20b20 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
20b30 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
20b40 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
20b50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20b80 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
20b90 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
20ba0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
20bb0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
20bc0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
20bd0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
20be0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
20bf0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
20c00 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
20c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20c50 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
20c60 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
20c70 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
20c80 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
20c90 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
20ca0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
20cb0 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
20cc0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
20cd0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
20ce0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
20cf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
20d00 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
20d10 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
20d20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
20d30 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
20d40 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
20d50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20d60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20d70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
20d80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20d90 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
20da0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
20db0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20dc0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
20dd0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
20de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20df0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
20e00 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
20e10 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
20e20 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
20e30 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
20e40 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
20e50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
20e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e70 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
20e80 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
20e90 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
20ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
20eb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
20ec0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
20ed0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
20ee0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
20ef0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
20f00 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
20f10 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
20f20 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
20f30 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
20f40 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
20f50 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
20f60 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
20f70 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
20f80 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
20f90 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
20fa0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
20fb0 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
20fc0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
20fd0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
20fe0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
20ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
21000 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
21010 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
21020 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
21030 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
21040 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
21050 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
21060 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
21070 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
21080 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
21090 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
210a0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
210b0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
210c0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
210d0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
210e0 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
210f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
21100 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
21110 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
21120 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
21130 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
21140 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
21150 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
21160 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
21170 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
21180 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
21190 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
211a0 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
211b0 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
211c0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
211d0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
211e0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
211f0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
21200 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
21210 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
21220 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
21230 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
21240 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
21250 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
21260 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
21270 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
21280 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
21290 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
212a0 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
212b0 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
212c0 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
212d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
212e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
212f0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
21300 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
21310 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
21320 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21330 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
21340 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
21350 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
21360 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
21370 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
21380 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
21390 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
213a0 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
213b0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
213c0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
213d0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
213e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
213f0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
21400 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
21410 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21420 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
21430 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
21440 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
21450 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
21460 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
21470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
214a0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
214b0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
214c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
214d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
214e0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
214f0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
21500 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
21510 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
21520 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
21530 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
21540 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
21550 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
21560 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
21570 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
21580 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
21590 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
215a0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
215b0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
215c0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
215d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
215e0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
215f0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
21600 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
21610 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
21620 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
21630 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21640 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
21650 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
21660 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
21670 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
21680 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
21690 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
216a0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
216b0 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
216c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
216d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
216e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
216f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21700 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
21710 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
21720 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21730 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
21740 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
21750 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
21760 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
21770 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
21780 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
21790 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
217a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
217b0 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
217c0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
217d0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
217e0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
217f0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
21800 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
21810 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
21820 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
21830 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
21840 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
21850 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
21860 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
21870 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
21880 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
21890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
218a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
218b0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
218c0 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
218d0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
218e0 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
218f0 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
21900 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
21910 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
21920 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
21930 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
21940 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
21950 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
21960 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
21970 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
21980 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
21990 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
219a0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
219b0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
219c0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
219d0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
219e0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
219f0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
21a00 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
21a10 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
21a20 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
21a30 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
21a40 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
21a50 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
21a60 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
21a70 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
21a80 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
21a90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
21aa0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
21ab0 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
21ac0 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
21ad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21af0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
21b00 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
21b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
21b30 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
21b40 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
21b50 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
21b60 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
21b70 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
21b80 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
21b90 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
21ba0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
21bb0 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
21bc0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
21bd0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
21be0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21bf0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
21c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21c10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
21c20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
21c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
21c40 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
21c50 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
21c60 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
21c70 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
21c80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
21c90 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
21ca0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
21cb0 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
21cc0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
21cd0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
21ce0 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
21cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21d00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
21d10 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
21d20 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
21d30 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
21d40 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
21d50 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
21d60 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
21d70 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
21d80 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
21d90 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
21da0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21db0 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
21dc0 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
21dd0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
21de0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
21df0 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
21e00 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
21e10 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
21e20 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21e50 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
21e60 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
21e70 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
21ea0 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
21eb0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
21ec0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ee0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
21ef0 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
21f00 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
21f10 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
21f20 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
21f30 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
21f40 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
21f50 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
21f60 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
21f70 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
21f80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
21f90 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
21fa0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
21fb0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
21fc0 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
21fd0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
21fe0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
21ff0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
22000 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
22010 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
22020 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
22030 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
22040 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
22050 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
22060 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
22070 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
22080 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
22090 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
220a0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
220b0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
220c0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
220d0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
220e0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
220f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
22100 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
22110 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
22120 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
22130 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
22140 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
22150 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
22160 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
22170 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
22180 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
22190 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
221a0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
221b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
221c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
221d0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
221e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
221f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
22200 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
22210 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
22220 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22230 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
22240 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
22250 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22260 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
22270 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
22280 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
22290 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
222a0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
222b0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
222c0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
222d0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
222e0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
222f0 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
22300 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
22310 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22320 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22330 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
22340 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
22350 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
22360 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
22370 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22390 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
223a0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
223b0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
223c0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
223d0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
223e0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
223f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22420 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
22430 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
22440 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
22450 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
22460 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
22470 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
22480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22490 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
224a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
224b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
224c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
224d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
224e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
224f0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
22500 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
22510 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
22520 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
22530 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
22540 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
22550 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
22560 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
22570 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
22580 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
22590 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
225a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
225b0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
225c0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
225d0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
225e0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
225f0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
22600 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
22610 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
22620 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
22630 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
22640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
22650 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
22660 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
22670 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22680 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
22690 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
226a0 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
226b0 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
226c0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
226d0 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
226e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
226f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
22700 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
22710 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
22720 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
22730 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
22740 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
22750 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
22760 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
22770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22780 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
22790 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
227a0 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
227b0 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
227c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
227d0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
227e0 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
227f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
22800 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
22810 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
22820 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
22830 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
22840 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
22850 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
22860 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
22870 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
22880 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
22890 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
228a0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
228b0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
228c0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
228d0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
228e0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
228f0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
22900 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
22910 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
22920 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
22930 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
22940 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
22950 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
22960 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
22970 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
22980 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
22990 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
229a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
229b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
229c0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
229d0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
229e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
229f0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
22a00 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
22a10 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
22a20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
22a30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22a40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22a50 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
22a60 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
22a70 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
22a80 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
22a90 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
22aa0 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
22ab0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
22ac0 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
22ad0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
22ae0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
22af0 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
22b00 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
22b10 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
22b20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
22b30 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
22b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22b50 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
22b60 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
22b70 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
22b80 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
22b90 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
22ba0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
22bb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
22bc0 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
22bd0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
22be0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
22bf0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
22c00 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
22c10 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
22c20 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
22c30 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
22c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
22c60 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
22c70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
22c80 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
22c90 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
22ca0 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
22cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
22cc0 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
22cd0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
22ce0 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
22cf0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
22d00 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
22d10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22d20 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
22d30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22d40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
22d50 73 20 70 61 72 74 20 6f 66 20 6d 65 72 67 69 6e  s part of mergin
22d60 67 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  g an CONCURRENT 
22d70 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
22d80 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73 68 6f 74  .** the snapshot
22d90 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 20   at the head of 
22da0 74 68 65 20 77 61 6c 20 66 69 6c 65 2e 20 49 74  the wal file. It
22db0 20 72 65 6c 6f 63 61 74 65 73 20 61 6c 6c 20 70   relocates all p
22dc0 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 72  ages in the.** r
22dd0 61 6e 67 65 20 69 46 69 72 73 74 2e 2e 69 4c 61  ange iFirst..iLa
22de0 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 49  st, inclusive. I
22df0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
22e00 74 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  t the BtreePtrma
22e10 70 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  p .** structure 
22e20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4d 61 70  at BtShared.pMap
22e30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
22e40 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 6f  cation of the po
22e50 69 6e 74 65 72 73 20 74 6f 20 65 61 63 68 0a 2a  inters to each.*
22e60 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 72 61  * page in the ra
22e70 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e  nge..**.** If pn
22e80 43 75 72 72 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  Current is NULL,
22e90 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
22ea0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 61 72 65  in the range are
22eb0 20 6d 6f 76 65 64 20 74 6f 20 63 75 72 72 65 6e   moved to curren
22ec0 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c 6f 63 61  tly.** free loca
22ed0 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66 72 65 65  tions (i.e. free
22ee0 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29 20 77  -list entries) w
22ef0 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62 61  ithin the databa
22f00 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 70  se file before p
22f10 61 67 65 0a 2a 2a 20 69 46 69 72 73 74 2e 0a 2a  age.** iFirst..*
22f20 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70 6e 43 75  *.** Or, if pnCu
22f30 72 72 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  rrent is not NUL
22f40 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e 74  L, then it point
22f50 73 20 74 6f 20 61 20 76 61 6c 75 65 20 63 6f 6e  s to a value con
22f60 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63  taining the.** c
22f70 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
22f80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22f90 20 69 6e 20 70 61 67 65 73 2e 20 49 6e 20 74 68   in pages. In th
22fa0 69 73 20 63 61 73 65 2c 20 61 6c 6c 20 70 61 67  is case, all pag
22fb0 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c 6f 63 61  es are.** reloca
22fc0 74 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ted to the end o
22fd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22fe0 69 6c 65 20 2d 20 70 61 67 65 20 69 46 69 72 73  ile - page iFirs
22ff0 74 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 74  t is relocated t
23000 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70 6e 43 75  o.** page (*pnCu
23010 72 72 65 6e 74 2b 31 29 2c 20 70 61 67 65 20 69  rrent+1), page i
23020 46 69 72 73 74 2b 31 20 74 6f 20 70 61 67 65 20  First+1 to page 
23030 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32 29 2c 20  (*pnCurrent+2), 
23040 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 56 61  and so on..** Va
23050 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e 74 20 69  lue *pnCurrent i
23060 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 65 77  s set to the new
23070 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
23080 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 69  abase before thi
23090 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
230a0 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  eturns..**.** If
230b0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
230c0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
230d0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
230e0 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
230f0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
23100 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 6c  tic int btreeRel
23110 6f 63 61 74 65 52 61 6e 67 65 28 0a 20 20 42 74  ocateRange(.  Bt
23120 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23140 20 42 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   B-tree handle *
23150 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74 2c  /.  Pgno iFirst,
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
23180 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f  e to relocate */
23190 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 2c 20 20  .  Pgno iLast,  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
231c0 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a 20  to relocate */. 
231d0 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72 65 6e 74   Pgno *pnCurrent
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
23200 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61 62 61 73   IN/OUT: Databas
23210 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 69  e size */.){.  i
23220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23230 4b 3b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  K;.  BtreePtrmap
23240 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
23250 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50 67 3b 0a  ap;.  Pgno iPg;.
23260 0a 20 20 66 6f 72 28 69 50 67 3d 69 46 69 72 73  .  for(iPg=iFirs
23270 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20 26 26  t; iPg<=iLast &&
23280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
23290 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  iPg++){.    MemP
232a0 61 67 65 20 2a 70 46 72 65 65 20 3d 20 30 3b 20  age *pFree = 0; 
232b0 20 20 20 20 2f 2a 20 50 61 67 65 20 61 6c 6c 6f      /* Page allo
232c0 63 61 74 65 64 20 66 72 6f 6d 20 66 72 65 65 2d  cated from free-
232d0 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  list */.    MemP
232e0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
232f0 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20 20 20 20    Pgno iNew;    
23300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23310 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
23320 20 70 50 67 20 2a 2f 0a 20 20 20 20 50 74 72 6d   pPg */.    Ptrm
23330 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b  apEntry *pEntry;
23340 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
23350 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
23360 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20 20 69 66  e iPg */..    if
23370 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( iPg==PENDING_B
23380 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
23390 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
233a0 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50  ntry = &pMap->aP
233b0 74 72 5b 69 50 67 20 2d 20 70 4d 61 70 2d 3e 69  tr[iPg - pMap->i
233c0 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20 69 66 28  First];..    if(
233d0 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
233e0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
233f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 64 75  ){.      Pgno du
23400 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mmy;.      rc = 
23410 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
23420 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20 26  e(pBt, &pFree, &
23430 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42 54 41 4c  dummy, iPg, BTAL
23440 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
23450 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
23460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
23470 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
23480 65 66 63 6f 75 6e 74 28 70 46 72 65 65 2d 3e 70  efcount(pFree->p
23490 44 62 50 61 67 65 29 3d 3d 31 20 29 3b 0a 20 20  DbPage)==1 );.  
234a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
234b0 63 68 65 44 72 6f 70 28 70 46 72 65 65 2d 3e 70  cheDrop(pFree->p
234c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
234d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
234e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
234f0 64 75 6d 6d 79 3d 3d 69 50 67 20 29 3b 0a 20 20  dummy==iPg );.  
23500 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 75    }else if( pnCu
23510 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 62  rrent ){.      b
23520 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
23530 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a   iPg, &pPg, 0);.
23540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
23550 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
23560 65 61 62 6c 65 28 70 50 67 2d 3e 70 44 62 50 61  eable(pPg->pDbPa
23570 67 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ge) );.      ass
23580 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
23590 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  rPageRefcount(pP
235a0 67 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31 20 29  g->pDbPage)==1 )
235b0 3b 0a 20 20 20 20 20 20 69 4e 65 77 20 3d 20 2b  ;.      iNew = +
235c0 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b 0a 20  +(*pnCurrent);. 
235d0 20 20 20 20 20 69 66 28 20 69 4e 65 77 3d 3d 50       if( iNew==P
235e0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
235f0 28 70 42 74 29 20 29 20 69 4e 65 77 20 3d 20 2b  (pBt) ) iNew = +
23600 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b 0a 20  +(*pnCurrent);. 
23610 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
23620 74 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c  tePage(pBt, pPg,
23630 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20   pEntry->eType, 
23640 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 20  pEntry->parent, 
23650 69 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 20 20  iNew, 1);.      
23660 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
23670 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ll(pPg);.    }el
23680 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61  se{.      rc = a
23690 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
236a0 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20 26 69  (pBt, &pFree, &i
236b0 4e 65 77 2c 20 69 46 69 72 73 74 2d 31 2c 20 42  New, iFirst-1, B
236c0 54 41 4c 4c 4f 43 5f 4c 45 29 3b 0a 20 20 20 20  TALLOC_LE);.    
236d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
236e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 77 3c  LITE_OK || iNew<
236f0 69 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  iFirst );.      
23700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
23720 65 61 73 65 50 61 67 65 28 70 46 72 65 65 29 3b  easePage(pFree);
23730 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 47 65  .        btreeGe
23740 74 50 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20  tPage(pBt, iPg, 
23750 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
23760 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
23770 61 67 65 28 70 42 74 2c 20 70 50 67 2c 20 70 45  age(pBt, pPg, pE
23780 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e  ntry->eType, pEn
23790 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69 4e 65 77  try->parent,iNew
237a0 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ,1);.        rel
237b0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
237c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
237d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
237e0 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c  ./* !defined(SQL
237f0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
23800 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ENT).**.** The b
23810 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 70 61 73  -tree handle pas
23820 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
23830 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
23840 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a  t to commit an.*
23850 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  * CONCURRENT tra
23860 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 74 68 69  nsaction. At thi
23870 73 20 70 6f 69 6e 74 20 69 74 20 69 73 20 67 75  s point it is gu
23880 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
23890 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73 73 69 62  is is .** possib
238a0 6c 65 20 2d 20 74 68 65 20 77 61 6c 20 57 52 49  le - the wal WRI
238b0 54 45 52 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  TER lock is held
238c0 20 61 6e 64 20 69 74 20 69 73 20 6b 6e 6f 77 6e   and it is known
238d0 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
238e0 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 73  .** no conflicts
238f0 20 77 69 74 68 20 63 6f 6d 6d 69 74 74 65 64 20   with committed 
23900 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2f  transactions..*/
23910 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
23920 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 42 74 72  eFixUnlocked(Btr
23930 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
23940 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
23950 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
23960 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
23970 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d 20 70 50  1;.  u8 *p1 = pP
23980 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 50  age1->aData;.  P
23990 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
239a0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
239b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
239c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61 67 65 20  ;..  /* If page 
239d0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
239e0 65 20 69 73 20 6e 6f 74 20 77 72 69 74 61 62 6c  e is not writabl
239f0 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61 67 65 73  e, then no pages
23a00 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65 64 0a   were allocated.
23a10 20 20 2a 2a 20 6f 72 20 66 72 65 65 64 20 62 79    ** or freed by
23a20 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
23a30 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
23a40 6e 6f 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  no special handl
23a50 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ing is .  ** req
23a60 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
23a70 2c 20 69 66 20 70 61 67 65 20 31 20 69 73 20 64  , if page 1 is d
23a80 69 72 74 79 2c 20 70 72 6f 63 65 65 64 2e 20 20  irty, proceed.  
23a90 2a 2f 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  */.  BtreePtrmap
23aa0 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
23ab0 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e  ap;.  Pgno iTrun
23ac0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31  k = get4byte(&p1
23ad0 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f 20 6e 50  [32]);.  Pgno nP
23ae0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
23af0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 75 33 32  ount(pBt);.  u32
23b00 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
23b10 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 61  e(&p1[36]);..  a
23b20 73 73 65 72 74 28 20 70 42 74 2d 3e 70 4d 61 70  ssert( pBt->pMap
23b30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
23b40 65 33 50 61 67 65 72 55 70 67 72 61 64 65 53 6e  e3PagerUpgradeSn
23b50 61 70 73 68 6f 74 28 70 50 61 67 65 72 2c 20 70  apshot(pPager, p
23b60 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
23b70 0a 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70  .  assert( p1==p
23b80 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
23b90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 6e 6f  E_OK ){.    Pgno
23bb0 20 6e 48 50 61 67 65 20 3d 20 67 65 74 34 62 79   nHPage = get4by
23bc0 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a 20 20 20  te(&p1[28]);.   
23bd0 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 6e 48 50   Pgno nFin = nHP
23be0 61 67 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  age;         /* 
23bf0 53 69 7a 65 20 6f 66 20 64 62 20 61 66 74 65 72  Size of db after
23c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 72   transaction mer
23c10 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 73  ge */..    if( s
23c20 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
23c30 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
23c40 44 62 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  DbPage) ){.     
23c50 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b 20 3d 20   Pgno iHTrunk = 
23c60 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d  get4byte(&p1[32]
23c70 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e 48 46  );.      u32 nHF
23c80 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
23c90 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20 20 20 20  p1[36]);..      
23ca0 62 74 72 65 65 50 74 72 6d 61 70 43 68 65 63 6b  btreePtrmapCheck
23cb0 28 70 42 74 2c 20 6e 50 61 67 65 29 3b 0a 0a 20  (pBt, nPage);.. 
23cc0 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
23cd0 68 65 20 68 65 61 64 20 64 61 74 61 62 61 73 65  he head database
23ce0 20 66 72 65 65 20 6c 69 73 74 20 74 6f 20 74 68   free list to th
23cf0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72  e end of the cur
23d00 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 72  rent.      ** tr
23d10 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 65 65 2d  ansactions free-
23d20 6c 69 73 74 20 28 69 66 20 61 6e 79 29 2e 20 20  list (if any).  
23d30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  */.      if( iTr
23d40 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk!=0 ){.      
23d50 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 33    put4byte(&p1[3
23d60 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20 6e 46 72  6], nHFree + nFr
23d70 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ee);.        put
23d80 34 62 79 74 65 28 26 70 31 5b 33 32 5d 2c 20 69  4byte(&p1[32], i
23d90 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
23da0 77 68 69 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b  while( iTrunk ){
23db0 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
23dc0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69  e *pTrunk = sqli
23dd0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
23de0 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a  Pager, iTrunk);.
23df0 20 20 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b            iTrunk
23e00 20 3d 20 67 65 74 34 62 79 74 65 28 28 75 38 2a   = get4byte((u8*
23e10 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b  )pTrunk->pData);
23e20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
23e30 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  Trunk==0 ){.    
23e40 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
23e50 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44  ((u8*)pTrunk->pD
23e60 61 74 61 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20  ata, iHTrunk);. 
23e70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23e80 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
23e90 72 55 6e 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a  rUnref(pTrunk);.
23ea0 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
23eb0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 48   }..      if( nH
23ec0 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72  Page<(pMap->iFir
23ed0 73 74 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  st-1) ){.       
23ee0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
23ef0 20 63 6f 6e 73 69 73 74 65 64 20 6f 66 20 28 70   consisted of (p
23f00 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 70  Map->iFirst-1) p
23f10 61 67 65 73 20 77 68 65 6e 20 74 68 65 20 63 75  ages when the cu
23f20 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  rrent.        **
23f30 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
23f40 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
23f50 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75  ed. And an concu
23f60 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23f70 6e 20 6d 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  n may.        **
23f80 20 6e 6f 74 20 62 65 20 65 78 65 63 75 74 65 64   not be executed
23f90 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   on an auto-vacu
23fa0 75 6d 20 64 61 74 61 62 61 73 65 20 2d 20 73 6f  um database - so
23fb0 20 74 68 65 20 64 62 20 73 68 6f 75 6c 64 20 0a   the db should .
23fc0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68          ** not h
23fd0 61 76 65 20 73 68 72 75 6e 6b 20 73 69 6e 63 65  ave shrunk since
23fe0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23ff0 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65   was opened. The
24000 72 65 66 6f 72 65 20 6e 48 50 61 67 65 0a 20 20  refore nHPage.  
24010 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
24020 62 65 20 73 65 74 20 74 6f 20 28 70 4d 61 70 2d  be set to (pMap-
24030 3e 69 46 69 72 73 74 2d 31 29 20 6f 72 20 67 72  >iFirst-1) or gr
24040 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eater. */.      
24050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
24060 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24080 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
24090 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f  transaction allo
240a0 63 61 74 65 64 20 70 61 67 65 73 20 70 4d 61 70  cated pages pMap
240b0 2d 3e 69 46 69 72 73 74 20 74 68 72 6f 75 67 68  ->iFirst through
240c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 50 61 67  .        ** nPag
240d0 65 20 28 69 6e 63 6c 75 73 69 76 65 29 20 61 74  e (inclusive) at
240e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
240f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4d  database file. M
24100 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20 20  eanwhile,.      
24110 20 20 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e 73    ** other trans
24120 61 63 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c  actions have all
24130 6f 63 61 74 65 64 20 28 69 46 69 72 73 74 2e 2e  ocated (iFirst..
24140 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65  nHPage). So move
24150 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
24160 73 20 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e  s (iFirst..MIN(n
24170 50 61 67 65 2c 6e 48 50 61 67 65 29 29 20 74 6f  Page,nHPage)) to
24180 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50 61   (MAX(nPage,nHPa
24190 67 65 29 2b 31 29 2e 20 2a 2f 0a 20 20 20 20 20  ge)+1). */.     
241a0 20 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20     Pgno iLast = 
241b0 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61 67  MIN(nPage, nHPag
241c0 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  e);    /* Last p
241d0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
241e0 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 43 75 72         Pgno nCur
241f0 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
24200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
24210 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 64 62  rrent size of db
24220 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6e 43 75   */..        nCu
24230 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67  rrent = MAX(nPag
24240 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20 20 20  e, nHPage);.    
24250 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
24260 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20   nCurrent;.     
24270 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c     rc = btreeRel
24280 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20  ocateRange(pBt, 
24290 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c 20 69 4c  pMap->iFirst, iL
242a0 61 73 74 2c 20 26 6e 43 75 72 72 65 6e 74 29 3b  ast, &nCurrent);
242b0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
242c0 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63 6f  re are now no co
242d0 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74 68  llisions with th
242e0 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68  e snapshot at th
242f0 65 20 68 65 61 64 20 6f 66 20 74 68 65 0a 20 20  e head of the.  
24300 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
24310 65 20 66 69 6c 65 2e 20 53 6f 20 61 74 20 74 68  e file. So at th
24320 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c  is point it woul
24330 64 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  d be possible to
24340 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a   write.        *
24350 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
24360 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 42  n out to disk. B
24370 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20 74  efore doing so t
24380 68 6f 75 67 68 2c 20 61 74 74 65 6d 70 74 20 74  hough, attempt t
24390 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6c  o.        ** rel
243a0 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66 20 74 68  ocate some of th
243b0 65 20 6e 65 77 20 70 61 67 65 73 20 74 6f 20 66  e new pages to f
243c0 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69  ree locations wi
243d0 74 68 69 6e 20 74 68 65 20 62 6f 64 79 0a 20 20  thin the body.  
243e0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
243f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 69  database file (i
24400 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e  .e. free-list en
24410 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20 20  tries). */.     
24420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24440 20 20 61 73 73 65 72 74 28 20 6e 43 75 72 72 65    assert( nCurre
24450 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  nt!=PENDING_BYTE
24460 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
24470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
24480 61 67 65 72 53 65 74 44 62 73 69 7a 65 28 70 42  agerSetDbsize(pB
24490 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43 75 72 72  t->pPager, nCurr
244a0 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
244b0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
244c0 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20 20  (&p1[36]);.     
244d0 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 43 75 72       nFin = nCur
244e0 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20 20 20 20  rent-nFree;.    
244f0 20 20 20 20 20 20 69 66 28 20 6e 43 75 72 72 65        if( nCurre
24500 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  nt>PENDING_BYTE_
24510 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
24520 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n<=PENDING_BYTE_
24530 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
24540 20 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b           nFin--;
24550 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24560 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 4d 41         nFin = MA
24570 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67 65 29 3b  X(nFin, nHPage);
24580 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24590 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e  btreeRelocateRan
245a0 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c 20  ge(pBt, nFin+1, 
245b0 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20  nCurrent, 0);.  
245c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
245d0 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 32 38   put4byte(&p1[28
245e0 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
245f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
24600 74 65 33 50 61 67 65 72 53 65 74 44 62 73 69 7a  te3PagerSetDbsiz
24610 65 28 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  e(pPager, nFin);
24620 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
24630 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
24640 69 6e 65 20 62 74 72 65 65 46 69 78 55 6e 6c 6f  ine btreeFixUnlo
24650 63 6b 65 64 28 58 29 20 20 53 51 4c 49 54 45 5f  cked(X)  SQLITE_
24660 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  OK.#endif /* SQL
24670 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
24680 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ENT */../*.** Th
24690 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
246a0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
246b0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
246c0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
246d0 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
246e0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
246f0 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
24700 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
24710 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
24720 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
24730 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
24740 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
24750 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
24760 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
24770 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
24780 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
24790 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
247a0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
247b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
247c0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
247d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
247e0 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
247f0 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
24800 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
24810 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
24820 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
24830 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
24840 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
24850 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
24860 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
24870 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
24880 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
24890 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
248a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
248b0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
248c0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
248d0 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
248e0 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
248f0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
24900 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
24910 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
24920 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
24930 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
24940 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
24950 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
24960 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
24970 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
24980 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
24990 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
249a0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
249b0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
249c0 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
249d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
249e0 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
249f0 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
24a00 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
24a10 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
24a20 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
24a30 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
24a40 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
24a50 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
24a60 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
24a70 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
24a80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
24a90 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
24aa0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
24ab0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
24ac0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
24ad0 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
24ae0 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
24af0 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
24b00 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
24b10 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
24b20 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
24b30 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
24b40 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
24b50 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
24b60 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
24b70 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
24b80 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
24b90 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
24ba0 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
24bb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
24bc0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
24bd0 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
24be0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
24bf0 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
24c00 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
24c10 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
24c20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24c30 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
24c40 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
24c50 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
24c60 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
24c70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24c80 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  r(p);..#ifndef S
24c90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24ca0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
24cb0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
24cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
24cd0 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20 29  SCONCURRENT==0 )
24ce0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  ;.      rc = aut
24cf0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
24d00 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
24d10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
24d30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
24d40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24d60 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
24d70 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
24d80 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
24d90 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
24da0 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
24db0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
24dc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24dd0 49 54 45 5f 4f 4b 20 26 26 20 49 53 43 4f 4e 43  ITE_OK && ISCONC
24de0 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  URRENT ){.      
24df0 72 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e 6c  rc = btreeFixUnl
24e00 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a  ocked(p);.    }.
24e10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
24e30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24e40 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
24e50 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
24e60 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ter, 0);.    }. 
24e70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24e80 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
24e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24ea0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24eb0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
24ec0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
24ed0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
24ee0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
24ef0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
24f00 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
24f10 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
24f20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
24f30 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
24f40 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
24f50 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
24f60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
24f70 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
24f80 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
24f90 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
24fa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24fb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
24fc0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
24fd0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
24fe0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
24ff0 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
25000 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
25010 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
25020 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
25030 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
25040 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
25050 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
25060 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
25070 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
25080 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
25090 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
250a0 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
250b0 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
250c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
250d0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
250e0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
250f0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
25100 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
25110 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
25120 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
25130 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
25140 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
25150 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
25160 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
25170 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
25180 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
25190 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
251a0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
251b0 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
251c0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
251d0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
251e0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
251f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
25200 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
25210 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
25220 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
25230 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
25240 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
25250 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
25260 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
25270 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
25280 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
25290 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
252a0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
252b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
252c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
252d0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
252e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
252f0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
25300 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
25310 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
25320 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
25330 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
25340 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
25350 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
25360 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
25370 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
25380 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
25390 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
253a0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
253b0 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  d(pBt);.  }..  /
253c0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
253d0 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e   CONCURRENT tran
253e0 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65 20  saction, delete 
253f0 74 68 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f 62  the pBt->pMap ob
25400 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c 73 6f 20  ject..  ** Also 
25410 63 61 6c 6c 20 50 61 67 65 72 45 6e 64 43 6f 6e  call PagerEndCon
25420 63 75 72 72 65 6e 74 28 29 20 74 6f 20 65 6e 73  current() to ens
25430 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
25440 65 72 20 68 61 73 20 64 69 73 63 61 72 64 65 64  er has discarded
25450 0a 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64  .  ** the record
25460 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 72 65   of all pages re
25470 61 64 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ad within the tr
25480 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
25490 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65   btreePtrmapDele
254a0 74 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  te(pBt);.  sqlit
254b0 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72  e3PagerEndConcur
254c0 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rent(pBt->pPager
254d0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
254e0 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
254f0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
25500 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
25510 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
25520 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25530 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
25540 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
25550 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
25560 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
25570 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
25580 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
25590 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
255a0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
255b0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
255c0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
255d0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
255e0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
255f0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
25600 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
25610 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
25620 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
25630 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
25640 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
25650 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
25660 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
25670 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
25680 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
25690 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
256a0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
256b0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
256c0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
256d0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
256e0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
256f0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
25700 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25710 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
25720 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
25730 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
25740 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25750 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
25760 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
25770 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
25780 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
25790 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
257a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
257b0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
257c0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
257d0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
257e0 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
257f0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
25800 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
25810 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
25820 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
25830 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
25840 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
25850 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
25860 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
25870 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
25880 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
25890 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
258a0 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
258b0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
258c0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
258d0 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
258e0 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
258f0 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
25900 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
25910 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
25920 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
25930 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
25940 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
25950 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
25960 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
25970 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
25980 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
25990 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
259a0 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
259b0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
259c0 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
259d0 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
259e0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
259f0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
25a00 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
25a10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25a20 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
25a30 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
25a40 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
25a50 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
25a60 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
25a70 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
25a80 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
25a90 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
25aa0 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
25ab0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
25ac0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
25ad0 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
25ae0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
25af0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
25b00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
25b10 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
25b20 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
25b30 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
25b40 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
25b50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
25b60 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
25b70 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
25b80 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
25b90 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
25ba0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
25bb0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
25bc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
25bd0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
25be0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
25bf0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
25c00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25c10 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
25c20 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
25c30 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
25c40 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
25c50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
25c60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
25c70 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
25c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
25c90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
25ca0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25cb0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
25cc0 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
25cd0 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
25ce0 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
25cf0 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
25d00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
25d10 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
25d20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
25d30 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
25d40 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
25d50 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
25d60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25d70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
25d80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
25d90 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
25da0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
25db0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25dc0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
25dd0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
25de0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
25df0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
25e00 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
25e10 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
25e20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25e30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
25e40 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
25e50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
25e60 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
25e70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
25e80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25e90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
25ea0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
25eb0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
25ec0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
25ed0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
25ee0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
25ef0 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
25f00 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
25f10 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
25f20 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
25f30 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
25f40 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
25f50 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
25f60 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
25f70 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
25f80 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
25f90 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
25fa0 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
25fb0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
25fc0 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
25fd0 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
25fe0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
25ff0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
26000 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
26010 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
26020 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
26030 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
26040 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
26050 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
26060 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
26070 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
26080 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
26090 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
260a0 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
260b0 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
260c0 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
260d0 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
260e0 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
260f0 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
26100 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
26110 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
26120 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
26130 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
26140 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
26150 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
26160 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
26170 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
26180 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
26190 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
261a0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
261b0 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
261c0 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
261d0 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
261e0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
261f0 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
26200 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
26210 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
26220 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
26230 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
26240 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
26250 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
26260 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
26270 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
26280 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
26290 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
262a0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
262b0 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
262c0 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
262d0 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
262e0 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
262f0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
26300 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
26310 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
26320 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
26330 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
26340 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
26350 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
26360 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
26370 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
26380 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
26390 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
263a0 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
263b0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
263c0 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
263d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
263e0 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
263f0 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
26400 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
26410 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
26420 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
26430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
26440 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
26450 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
26460 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
26470 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
26480 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79     if( writeOnly
26490 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73   && (p->curFlags
264a0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
264b0 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
264c0 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d   if( p->eState==
264d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
264e0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
264f0 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
26500 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
26510 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
26520 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
26530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ){.            (
26550 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65  void)sqlite3Btre
26560 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
26570 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a  pBtree, rc, 0);.
26580 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
26590 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
265a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
265b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
265c0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
265d0 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20  ursor(p);.      
265e0 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
265f0 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
26600 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
26610 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  = errCode;.     
26620 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65   }.      btreeRe
26630 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
26640 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ges(p);.    }.  
26650 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
26660 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
26670 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26680 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
26690 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
266a0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
266b0 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  ** If tripCode i
266c0 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
266d0 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c  then cursors wil
266e0 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
266f0 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f   (tripped)..** O
26700 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
26710 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66  s are tripped if
26720 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72   writeOnly is tr
26730 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f  ue but all curso
26740 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65  rs are.** trippe
26750 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
26760 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74  s false.  Any at
26770 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20  tempt to use.** 
26780 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72  a tripped cursor
26790 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
267a0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
267b0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
267c0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
267d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
267e0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
267f0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
26800 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
26810 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
26820 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
26830 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
26840 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
26850 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69   int tripCode, i
26860 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
26870 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
26880 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
26890 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
268a0 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
268b0 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c   writeOnly==1 ||
268c0 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b   writeOnly==0 );
268d0 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43  .  assert( tripC
268e0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52  ode==SQLITE_ABOR
268f0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72  T_ROLLBACK || tr
26900 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
26910 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  K );.  sqlite3Bt
26920 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
26930 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
26940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26950 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
26960 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
26970 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
26980 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20   rc ) writeOnly 
26990 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
269a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
269b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
269c0 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
269d0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
269e0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
269f0 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72  (p, tripCode, wr
26a00 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73  iteOnly);.    as
26a10 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
26a20 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c  _OK || (writeOnl
26a30 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c  y==0 && rc2==SQL
26a40 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69  ITE_OK) );.    i
26a50 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
26a60 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
26a70 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
26a80 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
26a90 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
26aa0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
26ab0 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
26ac0 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
26ad0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
26ae0 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
26af0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
26b00 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
26b10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
26b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26b30 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
26b40 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
26b50 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
26b60 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
26b70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
26b80 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
26b90 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
26ba0 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
26bb0 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
26bc0 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
26bd0 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
26be0 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
26bf0 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
26c00 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
26c10 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
26c20 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
26c30 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
26c40 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
26c50 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
26c60 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
26c70 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
26c80 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
26c90 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
26ca0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
26cb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26cc0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
26cd0 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
26ce0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
26cf0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
26d00 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
26d10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26d20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
26d30 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
26d40 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
26d50 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
26d60 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
26d70 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
26d80 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
26d90 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
26da0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
26db0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
26dc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26dd0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
26de0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
26df0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
26e00 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
26e10 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
26e20 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
26e30 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
26e40 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
26e50 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
26e60 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
26e70 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
26e80 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
26e90 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
26ea0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
26eb0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
26ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
26ed0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
26ee0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
26ef0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
26f00 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
26f10 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
26f20 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
26f30 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
26f40 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
26f50 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
26f60 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
26f70 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
26f80 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
26f90 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
26fa0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
26fb0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
26fc0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
26fd0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
26fe0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
26ff0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
27000 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
27010 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
27020 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
27030 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
27040 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
27050 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
27060 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27070 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
27080 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
27090 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
270a0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
270b0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
270c0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
270d0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
270e0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
270f0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
27100 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
27110 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
27120 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
27130 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
27140 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
27150 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
27160 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
27170 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
27180 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
27190 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
271a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
271b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
271c0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
271d0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
271e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
271f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27200 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
27210 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
27220 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
27230 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
27240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
27250 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
27260 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
27270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
27280 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
27290 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
272a0 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
272b0 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
272c0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
272d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
272e0 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
272f0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
27300 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
27310 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
27320 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
27330 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
27340 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
27350 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
27360 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
27370 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
27380 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
27390 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
273a0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
273b0 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
273c0 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
273d0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
273e0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
273f0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
27400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27410 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
27420 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
27430 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 69 66 28  tatement);.  if(
27440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27450 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
27460 50 74 72 6d 61 70 42 65 67 69 6e 28 70 42 74 2c  PtrmapBegin(pBt,
27470 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
27480 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
27490 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
274a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
274b0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
274c0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
274d0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
274e0 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
274f0 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
27500 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
27510 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
27520 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
27530 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
27540 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
27550 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
27560 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
27570 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
27580 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
27590 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
275a0 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
275b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
275c0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
275d0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
275e0 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
275f0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
27600 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
27610 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
27620 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
27630 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
27640 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
27650 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
27660 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
27670 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
27680 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
27690 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
276a0 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
276b0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
276c0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
276d0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
276e0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
276f0 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
27700 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
27710 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
27720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27730 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
27740 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
27750 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
27760 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
27770 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
27780 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
27790 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
277a0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
277b0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
277c0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
277d0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
277e0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
277f0 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
27800 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
27810 28 70 29 3b 0a 20 20 20 20 62 74 72 65 65 50 74  (p);.    btreePt
27820 72 6d 61 70 45 6e 64 28 70 42 74 2c 20 6f 70 2c  rmapEnd(pBt, op,
27830 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
27840 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
27850 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
27860 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
27870 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
27880 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
27890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
278a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
278b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
278c0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
278d0 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
278e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
278f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27900 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
27910 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
27920 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
27930 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
27940 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
27950 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
27960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
27970 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
27980 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
27990 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
279a0 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
279b0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
279c0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
279d0 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
279e0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
279f0 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
27a00 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
27a10 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
27a20 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
27a30 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
27a40 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
27a50 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
27a60 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
27a70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
27a80 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
27a90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
27aa0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
27ab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27ac0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
27ad0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
27ae0 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
27af0 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
27b00 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
27b10 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
27b20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
27b30 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
27b40 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
27b50 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
27b60 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
27b70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
27b80 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
27b90 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
27ba0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
27bb0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
27bc0 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
27bd0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
27be0 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
27bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
27c00 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45  .** If the BTREE
27c10 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72  _WRCSR bit of wr
27c20 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  Flag is clear, t
27c30 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
27c40 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73  an only.** be us
27c50 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20  ed for reading. 
27c60 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
27c70 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20  CSR bit is set, 
27c80 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a  then the cursor.
27c90 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ** can be used f
27ca0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
27cb0 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  r writing if oth
27cc0 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
27cd0 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65  r writing.** are
27ce0 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
27cf0 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  e are the condit
27d00 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
27d10 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a  e met in order.*
27d20 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  * for writing to
27d30 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
27d40 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
27d50 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
27d60 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
27d70 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42  lag containing B
27d80 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a  TREE_WRCSR.**.**
27d90 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
27da0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
27db0 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
27dc0 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
27dd0 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
27de0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
27df0 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
27e00 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
27e10 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
27e20 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
27e30 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
27e40 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
27e50 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
27e60 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
27e70 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
27e80 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
27e90 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
27ea0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
27eb0 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
27ec0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
27ed0 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
27ee0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
27ef0 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
27f00 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
27f10 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
27f20 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
27f30 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
27f40 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f  **.** The BTREE_
27f50 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66  FORDELETE bit of
27f60 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69   wrFlag may opti
27f70 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66  onally be set if
27f80 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20   BTREE_WRCSR.** 
27f90 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44  is set.  If FORD
27fa0 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68  ELETE is set, th
27fb0 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  at is a hint to 
27fc0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
27fd0 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  on that.** this 
27fe0 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79  cursor will only
27ff0 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b   be used to seek
28000 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65   to and delete e
28010 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64  ntries of an ind
28020 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66  ex.** as part of
28030 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45   a larger DELETE
28040 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
28050 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20   FORDELETE hint 
28060 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a  is not used by.*
28070 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * this implement
28080 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61  ation.  But in a
28090 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c   hypothetical al
280a0 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67  ternative storag
280b0 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20  e engine .** in 
280c0 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72  which index entr
280d0 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  ies are automati
280e0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
280f0 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  en corresponding
28100 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61   table.** rows a
28110 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20  re deleted, the 
28120 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69  FORDELETE flag i
28130 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c  s a hint that al
28140 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54  l SEEK and DELET
28150 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  E.** operations 
28160 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63  on this cursor c
28170 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64  an be no-ops and
28180 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74   all READ operat
28190 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74  ions can .** ret
281a0 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28  urn a null row (
281b0 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78  2-bytes: 0x01 0x
281c0 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  00)..**.** No ch
281d0 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
281e0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
281f0 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
28200 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
28210 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
28220 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
28230 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
28240 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
28250 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
28260 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
28270 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
28280 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
28290 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
282a0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
282b0 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
282c0 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
282d0 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
282e0 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
282f0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
28300 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
28310 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28340 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
28350 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
28380 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
28390 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
283a0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
283d0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
283e0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
283f0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
28400 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
28410 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
28420 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
28430 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28450 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
28460 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
28470 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
28480 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
284a0 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
284b0 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72  andle */.  BtCur
284c0 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  sor *pX;        
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65    /* Looping ove
284f0 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73  r other all curs
28500 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ors */..  assert
28510 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
28520 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
28530 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
28540 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  =0 .       || wr
28550 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53  Flag==BTREE_WRCS
28560 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  R .       || wrF
28570 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53  lag==(BTREE_WRCS
28580 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  R|BTREE_FORDELET
28590 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  E) .  );..  /* T
285a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
285b0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
285c0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
285d0 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
285e0 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
285f0 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
28600 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
28610 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
28620 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
28630 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
28640 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
28650 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
28660 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
28670 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
28680 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
28690 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
286a0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
286b0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
286c0 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a  o!=0, (wrFlag?2:
286d0 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  1)) );.  assert(
286e0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
286f0 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
28700 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
28710 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
28720 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
28730 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
28740 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
28750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
28760 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
28770 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
28780 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
28790 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
287a0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
287b0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
287c0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
287d0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
287e0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70   wrFlag==0 || (p
287f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
28800 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
28810 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61   );..  if( wrFla
28820 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74  g ){.    allocat
28830 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
28840 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
28850 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74  mpSpace==0 ) ret
28860 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28870 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
28880 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
28890 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
288a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
288b0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
288c0 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
288d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
288e0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
288f0 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
28900 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
28910 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
28920 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
28930 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
28940 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
28950 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
28960 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
28970 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
28980 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
28990 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
289a0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
289b0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
289c0 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
289d0 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75   pBt;.  pCur->cu
289e0 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
289f0 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ? BTCF_WriteFlag
28a00 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   : 0;.  pCur->cu
28a10 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72  rPagerFlags = wr
28a20 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52  Flag ? 0 : PAGER
28a30 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  _GET_READONLY;. 
28a40 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
28a50 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
28a60 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
28a70 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
28a80 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f   such.  ** curso
28a90 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74  rs *must* have t
28aa0 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
28ab0 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20   flag set. */.  
28ac0 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72  for(pX=pBt->pCur
28ad0 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  sor; pX; pX=pX->
28ae0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
28af0 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  pX->pgnoRoot==(P
28b00 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
28b10 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73      pX->curFlags
28b20 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
28b30 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e;.      pCur->c
28b40 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
28b50 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a  Multiple;.    }.
28b60 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78    }.  pCur->pNex
28b70 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
28b80 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
28b90 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
28ba0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
28bb0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
28bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28bd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28be0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
28bf0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
28c20 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
28c30 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
28c60 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
28c70 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
28c80 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
28cb0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
28cc0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
28cd0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28cf0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
28d00 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
28d10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
28d40 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
28d50 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
28d60 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
28d70 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
28d80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
28d90 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
28da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
28db0 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
28dc0 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
28dd0 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
28de0 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
28df0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
28e00 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
28e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28e20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
28e30 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
28e40 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
28e50 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
28e60 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
28e70 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
28e80 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
28e90 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
28ea0 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
28eb0 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
28ec0 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
28ed0 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
28ee0 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
28ef0 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
28f00 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
28f10 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
28f20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
28f30 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
28f40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
28f50 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
28f60 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
28f70 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
28f80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
28f90 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
28fa0 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
28fb0 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
28fc0 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
28fd0 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
28fe0 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
28ff0 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
29000 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
29010 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
29020 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
29030 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
29040 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
29050 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
29060 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
29070 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
29080 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
29090 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
290a0 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
290b0 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
290c0 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
290d0 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
290e0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
290f0 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
29100 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
29110 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
29120 28 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52  (BtCursor, BTCUR
29130 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54  SOR_FIRST_UNINIT
29140 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
29150 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
29160 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
29170 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29180 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
29190 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
291a0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
291b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
291c0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
291d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
291e0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
291f0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
29200 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
29210 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
29220 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
29230 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
29240 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
29250 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
29260 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
29270 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
29280 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  r==pCur ){.     
29290 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
292a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
292b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74   }else{.      Bt
292c0 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20  Cursor *pPrev = 
292d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
292e0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
292f0 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  if( pPrev->pNext
29300 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
29310 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74      pPrev->pNext
29320 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
29330 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
29340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29350 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76     pPrev = pPrev
29360 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
29370 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50  while( ALWAYS(pP
29380 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  rev) );.    }.  
29390 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
293a0 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75  lCursorPages(pCu
293b0 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  r);.    unlockBt
293c0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
293d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
293e0 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
293f0 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ow);.    sqlite3
29400 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
29410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
29420 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
29430 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72  ;.    pCur->pBtr
29440 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ee = 0;.  }.  re
29450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29460 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
29470 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
29480 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
29490 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
294a0 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
294b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
294c0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
294d0 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
294e0 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
294f0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
29500 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
29510 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
29520 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
29530 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
29540 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
29550 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
29560 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
29570 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
29580 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
29590 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
295a0 47 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  G.  static int c
295b0 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c  ellInfoEqual(Cel
295c0 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e  lInfo *a, CellIn
295d0 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20  fo *b){.    if( 
295e0 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79  a->nKey!=b->nKey
295f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
29600 20 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64   if( a->pPayload
29610 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20  !=b->pPayload ) 
29620 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
29630 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62  ( a->nPayload!=b
29640 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74  ->nPayload ) ret
29650 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
29660 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f  ->nLocal!=b->nLo
29670 63 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  cal ) return 0;.
29680 20 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65      if( a->nSize
29690 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74  !=b->nSize ) ret
296a0 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72  urn 0;.    retur
296b0 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69  n 1;.  }.  stati
296c0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
296d0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
296e0 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
296f0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
29700 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
29710 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
29720 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
29730 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
29740 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a  ur->ix, &info);.
29750 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
29760 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e  UPT_DB || cellIn
29770 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26  foEqual(&info, &
29780 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20  pCur->info) );. 
29790 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
297a0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
297b0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
297c0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
297d0 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
297e0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
297f0 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
29800 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
29810 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  {.    pCur->curF
29820 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
29830 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
29840 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
29850 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c  >pPage,pCur->ix,
29860 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
29870 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
29880 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
29890 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
298a0 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
298b0 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
298c0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
298d0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
298e0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
298f0 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
29900 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
29910 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
29920 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
29930 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
29940 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
29950 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
29960 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
29970 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
29980 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
29990 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
299a0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
299b0 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
299c0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
299d0 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
299e0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
299f0 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
29a00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29a10 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
29a20 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20  * NDEBUG */.int 
29a30 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
29a40 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75  orIsValidNN(BtCu
29a50 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
29a60 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
29a70 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
29a80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29a90 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
29aa0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
29ab0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
29ac0 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66  key or "rowid" f
29ad0 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
29ae0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
29af0 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
29b00 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
29b10 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
29b20 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  to a.** ordinary
29b30 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49   table btree.  I
29b40 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
29b50 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  nts to an index 
29b60 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69  btree or.** is i
29b70 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75  nvalid, the resu
29b80 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  lt of this routi
29b90 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ne is undefined.
29ba0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
29bb0 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42  treeIntegerKey(B
29bc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29bd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29be0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
29bf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29c00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29c10 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
29c20 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
29c30 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65  ntKey );.  getCe
29c40 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
29c50 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
29c60 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65  o.nKey;.}..#ifde
29c70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29c80 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a  OFFSET_SQL_FUNC.
29c90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
29ca0 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
29cb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
29cc0 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
29cd0 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74  the.** payload t
29ce0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
29cf0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a  or is pointing..
29d00 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
29d10 72 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73  reeOffset(BtCurs
29d20 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
29d30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29d40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29d50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29d60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29d70 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
29d80 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
29d90 74 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e  turn (i64)pCur->
29da0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28  pBt->pageSize*((
29db0 69 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d  i64)pCur->pPage-
29dc0 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20  >pgno - 1) +.   
29dd0 20 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72        (i64)(pCur
29de0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  ->info.pPayload 
29df0 2d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  - pCur->pPage->a
29e00 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Data);.}.#endif 
29e10 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
29e20 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
29e30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
29e40 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
29e50 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
29e60 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
29e70 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63  hat pCur is.** c
29e80 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
29e90 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65  g to.  For table
29ea0 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
29eb0 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74  ll be the amount
29ec0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f  .** of data.  Fo
29ed0 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20  r index btrees, 
29ee0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
29ef0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79   size of the key
29f00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
29f10 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
29f20 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
29f30 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
29f40 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
29f50 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
29f60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
29f70 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
29f80 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
29f90 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
29fa0 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
29fb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29fc0 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  ALID..*/.u32 sql
29fd0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
29fe0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
29ff0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
2a000 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2a010 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a020 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2a030 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2a040 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
2a050 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
2a060 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
2a070 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  oad;.}../*.** Re
2a080 74 75 72 6e 20 61 6e 20 75 70 70 65 72 20 62 6f  turn an upper bo
2a090 75 6e 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  und on the size 
2a0a0 6f 66 20 61 6e 79 20 72 65 63 6f 72 64 20 66 6f  of any record fo
2a0b0 72 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 74  r the table.** t
2a0c0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
2a0d0 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 2e  s pointing into.
2a0e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
2a0f0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
2a100 20 45 76 65 72 79 74 68 69 6e 67 20 77 69 6c 6c   Everything will
2a110 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 74   still work if t
2a120 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61  his.** routine a
2a130 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 32 31  lways returns 21
2a140 34 37 34 38 33 36 34 37 20 28 77 68 69 63 68 20  47483647 (which 
2a150 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
2a160 65 63 6f 72 64 0a 2a 2a 20 74 68 61 74 20 53 51  ecord.** that SQ
2a170 4c 69 74 65 20 63 61 6e 20 68 61 6e 64 6c 65 29  Lite can handle)
2a180 20 6f 72 20 6d 6f 72 65 2e 20 20 42 75 74 20 72   or more.  But r
2a190 65 74 75 72 6e 69 6e 67 20 61 20 73 6d 61 6c 6c  eturning a small
2a1a0 65 72 20 76 61 6c 75 65 20 6d 69 67 68 74 0a 2a  er value might.*
2a1b0 2a 20 70 72 65 76 65 6e 74 20 6c 61 72 67 65 20  * prevent large 
2a1c0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2a1d0 6e 73 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  ns when trying t
2a1e0 6f 20 69 6e 74 65 72 70 72 65 74 20 61 0a 2a 2a  o interpret a.**
2a1f0 20 63 6f 72 72 75 70 74 20 64 61 74 72 61 62 61   corrupt datraba
2a200 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  se..**.** The cu
2a210 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2a220 74 69 6f 6e 20 6d 65 72 65 6c 79 20 72 65 74 75  tion merely retu
2a230 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rns the size of 
2a240 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
2a250 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
2a260 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
2a270 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  4 sqlite3BtreeMa
2a280 78 52 65 63 6f 72 64 53 69 7a 65 28 42 74 43 75  xRecordSize(BtCu
2a290 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
2a2a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2a2b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2a2c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a2d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a2e0 56 41 4c 49 44 20 29 3b 0a 20 20 72 65 74 75 72  VALID );.  retur
2a2f0 6e 20 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67  n pCur->pBt->pag
2a300 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
2a310 5f 69 6e 74 36 34 29 70 43 75 72 2d 3e 70 42 74  _int64)pCur->pBt
2a320 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->nPage;.}../*.*
2a330 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
2a340 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
2a350 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
2a360 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
2a370 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
2a380 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
2a390 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
2a3a0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
2a3b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
2a3c0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
2a3d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2a3e0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
2a3f0 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
2a400 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
2a410 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
2a420 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
2a430 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
2a440 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
2a450 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2a460 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
2a470 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2a480 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
2a490 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
2a4a0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2a4b0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
2a4c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
2a4d0 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
2a4e0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
2a4f0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
2a500 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
2a510 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
2a520 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
2a530 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
2a540 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
2a550 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
2a560 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
2a570 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
2a580 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
2a590 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
2a5a0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
2a5b0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
2a5c0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
2a5d0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
2a5e0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
2a5f0 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
2a600 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
2a610 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
2a620 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
2a630 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
2a640 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
2a650 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
2a660 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
2a670 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
2a680 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
2a690 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
2a6a0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
2a6b0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
2a6c0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
2a6d0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
2a6e0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
2a6f0 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
2a700 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2a710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a720 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2a730 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
2a760 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
2a770 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
2a780 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
2a790 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
2a7a0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
2a7b0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
2a7c0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
2a7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2a7e0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
2a7f0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
2a800 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
2a810 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
2a820 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
2a830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2a840 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a850 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2a860 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2a870 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
2a880 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2a890 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2a8a0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
2a8b0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
2a8c0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
2a8d0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
2a8e0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
2a8f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
2a900 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
2a910 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
2a920 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
2a930 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
2a940 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
2a950 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
2a960 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
2a970 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
2a980 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
2a990 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
2a9a0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
2a9b0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
2a9c0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
2a9d0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
2a9e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a9f0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2aa00 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
2aa10 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
2aa20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
2aa30 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
2aa40 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
2aa50 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
2aa60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2aa70 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
2aa80 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
2aa90 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
2aaa0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2aab0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2aac0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
2aad0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
2aae0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2aaf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ab00 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
2ab10 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
2ab20 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
2ab30 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
2ab40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2ab50 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
2ab60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
2ab70 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
2ab80 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
2ab90 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
2aba0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2abb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
2abc0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
2abd0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
2abe0 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
2abf0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
2ac00 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
2ac10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2ac20 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
2ac30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
2ac50 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
2ac60 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
2ac70 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
2ac80 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
2ac90 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
2aca0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
2acb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
2acc0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2acd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
2ace0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
2acf0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
2ad00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
2ad10 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
2ad20 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
2ad30 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
2ad40 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
2ad50 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
2ad60 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
2ad70 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
2ad80 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
2ad90 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
2ada0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
2adb0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
2adc0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
2add0 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
2ade0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
2adf0 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
2ae00 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
2ae10 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
2ae20 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
2ae30 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
2ae40 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
2ae50 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
2ae60 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
2ae70 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
2ae80 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
2ae90 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2aea0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
2aeb0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
2aec0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
2aed0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
2aee0 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
2aef0 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
2af00 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2af10 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
2af20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
2af30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2af40 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
2af50 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2af80 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2af90 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
2afa0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
2afb0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
2afc0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
2afd0 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
2afe0 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
2aff0 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
2b000 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
2b010 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
2b020 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
2b030 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
2b040 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
2b050 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
2b060 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2b070 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
2b080 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2b090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b0a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b0b0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
2b0c0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
2b0d0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
2b0e0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
2b0f0 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
2b100 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
2b110 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
2b120 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
2b130 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
2b140 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2b150 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2b160 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b170 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
2b180 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
2b190 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
2b1a0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
2b1b0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
2b1c0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2b1d0 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
2b1e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
2b1f0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
2b200 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
2b210 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
2b220 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
2b230 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
2b240 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
2b250 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
2b260 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
2b270 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
2b280 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
2b290 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
2b2a0 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
2b2b0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
2b2c0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
2b2d0 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
2b2e0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
2b2f0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
2b300 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
2b310 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
2b320 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
2b330 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
2b340 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
2b350 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
2b360 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
2b370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2b380 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
2b390 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
2b3a0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
2b3b0 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ges.** this func
2b3c0 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
2b3d0 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
2b3e0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a  lazily populate.
2b3f0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
2b400 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
2b410 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
2b420 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
2b430 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
2b440 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
2b450 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
2b460 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
2b470 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
2b480 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
2b490 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
2b4a0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
2b4b0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
2b4c0 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65  ated, it must be
2b4d0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
2b4e0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
2b4f0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
2b500 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
2b510 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
2b520 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
2b530 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
2b540 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
2b550 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
2b560 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
2b570 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
2b580 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
2b590 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
2b5a0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
2b5b0 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
2b5c0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
2b5d0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
2b5e0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
2b5f0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
2b600 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
2b610 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
2b620 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2b630 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2b640 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
2b650 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2b660 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
2b670 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
2b680 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
2b690 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
2b6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
2b6b0 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
2b6c0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
2b6d0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
2b6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2b6f0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
2b700 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
2b710 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
2b720 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
2b730 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
2b740 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
2b750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2b760 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
2b770 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
2b780 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
2b790 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
2b7a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b7b0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
2b7c0 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
2b7d0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2b7e0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2b7f0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61       /* Btree pa
2b800 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
2b810 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
2b820 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
2b830 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
2b840 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
2b850 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
2b860 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
2b870 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
2b880 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
2b890 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
2b8a0 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
2b8b0 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72  Buf;     /* Star
2b8c0 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75  t of original ou
2b8d0 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64  t buffer */.#end
2b8e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
2b8f0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
2b900 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d   eOp==0 || eOp==
2b910 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2b920 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b930 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2b940 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2b950 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2b960 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b970 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2b980 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
2b990 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
2b9a0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
2b9b0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73  o.pPayload;.  as
2b9c0 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
2b9d0 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
2b9e0 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
2b9f0 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
2ba00 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
2ba10 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
2ba20 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
2ba30 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
2ba40 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
2ba50 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
2ba60 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
2ba70 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
2ba80 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2ba90 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
2baa0 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
2bab0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
2bac0 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
2bad0 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
2bae0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
2baf0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
2bb00 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
2bb10 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
2bb20 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
2bb30 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
2bb40 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
2bb50 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
2bb60 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
2bb70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2bb80 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
2bb90 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  e);.  }..  /* Ch
2bba0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
2bbb0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
2bbc0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
2bbd0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
2bbe0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
2bbf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2bc00 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
2bc10 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
2bc20 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
2bc30 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
2bc40 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
2bc50 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
2bc60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2bc70 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
2bc80 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
2bc90 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
2bca0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2bcb0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
2bcc0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
2bcd0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
2bce0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
2bcf0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
2bd00 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66  ocal;.  }...  if
2bd10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bd20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
2bd30 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
2bd40 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2bd50 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
2bd60 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
2bd70 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
2bd80 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
2bd90 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
2bda0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
2bdb0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
2bdc0 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
2bdd0 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
2bde0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
2bdf0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
2be00 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
2be10 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  now..    **.    
2be20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
2be30 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
2be40 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
2be50 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
2be60 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
2be70 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
2be80 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
2be90 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
2bea0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
2beb0 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
2bec0 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
2bed0 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
2bee0 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
2bef0 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
2bf00 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
2bf10 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
2bf20 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
2bf30 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
2bf40 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
2bf50 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2bf60 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b  ValidOvfl)==0 ){
2bf70 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
2bf80 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
2bf90 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
2bfa0 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
2bfb0 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
2bfc0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2bfd0 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20  aOverflow==0.   
2bfe0 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e      || nOvfl*(in
2bff0 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 3e  t)sizeof(Pgno) >
2c000 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
2c010 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ze(pCur->aOverfl
2c020 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ow).      ){.   
2c030 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20       Pgno *aNew 
2c040 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33  = (Pgno*)sqlite3
2c050 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
2c060 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
2c070 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
2c080 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
2c090 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2c0a0 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
2c0b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c0c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2c0d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c0e0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c0f0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
2c100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c110 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
2c120 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
2c130 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
2c140 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
2c150 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2c160 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
2c170 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c180 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
2c190 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
2c1a0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
2c1b0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2c1c0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  .      ** entry 
2c1d0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
2c1e0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
2c1f0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
2c200 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72  kip.      ** dir
2c210 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
2c220 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2c230 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2c240 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
2c250 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78   ){.        iIdx
2c260 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
2c270 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ize);.        ne
2c280 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
2c290 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
2c2a0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
2c2b0 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
2c2c0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2c2d0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
2c2e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c2f0 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69  amt>0 );.    whi
2c300 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a  le( nextPage ){.
2c310 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
2c320 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
2c330 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2c340 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
2c350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2c360 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
2c370 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dx]==0.         
2c380 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f       || pCur->aO
2c390 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
2c3a0 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20  extPage.        
2c3b0 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
2c3c0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75  _DB );.      pCu
2c3d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
2c3e0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a  x] = nextPage;..
2c3f0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
2c400 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
2c410 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
2c420 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
2c430 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
2c440 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
2c450 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2c460 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
2c470 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
2c480 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
2c490 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2c4a0 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
2c4b0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
2c4c0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
2c4d0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
2c4e0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
2c4f0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
2c500 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
2c510 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
2c520 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
2c530 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
2c540 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
2c550 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
2c560 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2c570 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
2c580 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2c590 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e  Btree->db==pBt->
2c5a0 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db );.        if
2c5b0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
2c5c0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
2c5d0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
2c5e0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
2c5f0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
2c600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c610 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
2c620 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
2c630 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
2c640 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2c650 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
2c660 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
2c670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c680 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
2c690 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
2c6a0 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
2c6b0 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
2c6c0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
2c6d0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
2c6e0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
2c6f0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
2c700 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
2c710 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
2c720 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
2c730 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
2c740 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
2c750 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
2c760 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
2c770 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
2c780 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
2c790 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
2c7a0 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
2c7b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2c7c0 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
2c7d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
2c7e0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
2c7f0 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
2c800 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
2c810 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
2c820 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
2c830 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
2c840 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
2c850 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65     **   3) there
2c860 20 61 72 65 20 6e 6f 20 64 69 72 74 79 20 70 61   are no dirty pa
2c870 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  ges in the page-
2c880 63 61 63 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  cache.        **
2c890 20 20 20 34 29 20 74 68 65 20 64 61 74 61 62 61     4) the databa
2c8a0 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
2c8b0 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
2c8c0 2a 20 20 20 35 29 20 74 68 65 20 70 61 67 65 20  *   5) the page 
2c8d0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41  is not in the WA
2c8e0 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  L file.        *
2c8f0 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73 74 20  *   6) at least 
2c900 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
2c910 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
2c920 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
2c930 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
2c940 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
2c950 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
2c960 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
2c970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c980 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
2c990 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
2c9a0 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
2c9b0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
2c9c0 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
2c9d0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
2c9e0 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
2c9f0 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
2ca00 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
2ca10 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
2ca20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2ca30 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20   eOp==0         
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca60 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
2ca70 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
2ca80 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cab0 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
2cac0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  && sqlite3PagerD
2cad0 69 72 65 63 74 52 65 61 64 4f 6b 28 70 42 74 2d  irectReadOk(pBt-
2cae0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
2caf0 65 29 20 20 20 20 2f 2a 20 28 33 2c 34 2c 35 29  e)    /* (3,4,5)
2cb00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
2cb10 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
2cb20 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb40 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
2cb50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cb60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2cb70 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
2cb80 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
2cb90 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  r);.          u8
2cba0 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
2cbb0 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
2cbc0 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
2cbd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61         assert( a
2cbe0 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74  Write>=pBufStart
2cbf0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2cc10 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20  ue to (6) */.   
2cc20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
2cc30 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
2cc40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2cc50 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
2cc60 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
2cc70 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
2cc80 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
2cc90 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
2cca0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
2ccb0 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
2ccc0 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
2ccd0 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
2cce0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2ccf0 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
2cd00 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
2cd10 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
2cd20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2cd30 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
2cd40 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
2cd50 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
2cd60 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50       (eOp==0 ? P
2cd70 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
2cd80 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
2cd90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2cda0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cdb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2cdc0 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
2cdd0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2cde0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2cdf0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
2ce00 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
2ce10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2ce20 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
2ce30 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
2ce40 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  +4], pBuf, a, eO
2ce50 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  p, pDbPage);.   
2ce60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ce70 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
2ce80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2ce90 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
2cea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ceb0 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
2cec0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = a;.        if(
2ced0 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e   amt==0 ) return
2cee0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75   rc;.        pBu
2cef0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
2cf00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2cf10 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78  reak;.      iIdx
2cf20 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
2cf30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cf40 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
2cf50 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63     /* Overflow c
2cf60 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74  hain ends premat
2cf70 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  urely */.    ret
2cf80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2cf90 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
2cfa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2cfb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
2cfc0 61 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f  art of the paylo
2cfd0 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61  ad for the row a
2cfe0 74 20 77 68 69 63 68 20 74 68 61 74 20 63 75 72  t which that cur
2cff0 73 6f 72 20 70 43 75 72 20 69 73 20 63 75 72 72  sor pCur is curr
2d000 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
2d010 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65 73 20  g.  "amt" bytes 
2d020 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
2d030 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
2d040 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
2d050 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
2d060 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  set"..**.** pCur
2d070 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67   can be pointing
2d080 20 74 6f 20 65 69 74 68 65 72 20 61 20 74 61 62   to either a tab
2d090 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62  le or an index b
2d0a0 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69  -tree..** If poi
2d0b0 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
2d0c0 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65   btree, then the
2d0d0 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e   content section
2d0e0 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a   is read.  If.**
2d0f0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
2d100 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d  g to an index b-
2d110 74 72 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65  tree then the ke
2d120 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61  y section is rea
2d130 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c  d..**.** For sql
2d140 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2d150 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  (), the caller m
2d160 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
2d170 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
2d180 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72  .** to a valid r
2d190 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ow in the table.
2d1a0 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72    For sqlite3Btr
2d1b0 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
2d1c0 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  (), the.** curso
2d1d0 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c  r might be inval
2d1e0 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64  id or might need
2d1f0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20   to be restored 
2d200 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61  before being rea
2d210 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
2d220 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
2d230 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
2d240 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
2d250 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
2d260 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
2d270 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
2d280 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
2d290 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
2d2a0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
2d2b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2d2c0 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72  reePayload(BtCur
2d2d0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
2d2e0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
2d2f0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
2d300 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2d310 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2d320 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d330 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d340 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2d350 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2d360 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
2d370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d380 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61  ur->ix<pCur->pPa
2d390 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  ge->nCell );.  r
2d3a0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
2d3b0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
2d3c0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
2d3d0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
2d3e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
2d3f0 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65  ariant of sqlite
2d400 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20  3BtreePayload() 
2d410 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68  works even if th
2d420 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
2d430 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f  .** in the CURSO
2d440 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20  R_VALID state.  
2d450 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
2d460 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  by the sqlite3_b
2d470 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e  lob_read().** in
2d480 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e  terface..*/.#ifn
2d490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d4a0 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20  INCRBLOB.static 
2d4b0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2d4c0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
2d4d0 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75  dChecked(.  BtCu
2d4e0 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33  rsor *pCur,.  u3
2d4f0 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20  2 offset,.  u32 
2d500 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75  amt,.  void *pBu
2d510 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  f.){.  int rc;. 
2d520 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
2d530 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2d540 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
2d550 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
2d560 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 75 72   }.  assert( cur
2d570 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2d580 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
2d590 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
2d5a0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2d5b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
2d5c0 72 63 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f  rc : accessPaylo
2d5d0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
2d5e0 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
2d5f0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2d600 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
2d610 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2d620 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
2d630 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
2d640 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
2d650 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d660 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
2d670 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2d680 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2d690 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73     return access
2d6a0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
2d6b0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
2d6c0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
2d6d0 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
2d6e0 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43  ayloadChecked(pC
2d6f0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
2d700 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65   pBuf);.  }.}.#e
2d710 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2d720 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
2d730 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2d740 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
2d750 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
2d760 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
2d770 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
2d780 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2d790 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
2d7a0 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
2d7b0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
2d7c0 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
2d7d0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
2d7e0 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
2d7f0 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
2d800 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
2d810 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
2d820 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
2d830 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
2d840 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
2d850 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
2d860 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
2d870 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
2d880 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
2d890 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
2d8a0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
2d8b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2d8c0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2d8d0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
2d8e0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
2d8f0 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
2d900 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
2d910 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
2d920 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
2d930 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
2d940 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
2d950 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
2d960 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2d970 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
2d980 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
2d990 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
2d9a0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
2d9b0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
2d9c0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
2d9d0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
2d9e0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
2d9f0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
2da00 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
2da10 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
2da20 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
2da30 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
2da40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
2da50 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
2da60 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
2da70 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
2da80 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
2da90 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
2daa0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
2dab0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
2dac0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
2dad0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
2dae0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
2daf0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2db00 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
2db10 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
2db20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
2db30 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
2db40 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
2db50 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
2db60 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
2db70 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
2db80 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
2db90 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
2dba0 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73  .  int amt;.  as
2dbb0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
2dbc0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2dbd0 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  && pCur->pPage);
2dbe0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2dbf0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2dc00 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2dc10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2dc20 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2dc30 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2dc40 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2dc50 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2dc60 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2dc70 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2dc80 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2dc90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2dca0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b  >info.nSize>0 );
2dcb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2dcc0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70  >info.pPayload>p
2dcd0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2dce0 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
2dcf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2dd00 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2dd10 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  <pCur->pPage->aD
2dd20 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54  ataEnd ||CORRUPT
2dd30 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43  _DB);.  amt = pC
2dd40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
2dd50 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e 74 29  .  if( amt>(int)
2dd60 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  (pCur->pPage->aD
2dd70 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
2dd80 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b  nfo.pPayload) ){
2dd90 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
2dda0 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61 63   too little spac
2ddb0 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 66 6f  e on the page fo
2ddc0 72 20 74 68 65 20 65 78 70 65 63 74 65 64 20 61  r the expected a
2ddd0 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  mount.    ** of 
2dde0 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44  local content. D
2ddf0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2de00 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2de10 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
2de20 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20  DB );.    amt = 
2de30 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70 43 75  MAX(0, (int)(pCu
2de40 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
2de50 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
2de60 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a  pPayload));.  }.
2de70 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32 29 61    *pAmt = (u32)a
2de80 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
2de90 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
2dea0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
2deb0 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
2dec0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
2ded0 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
2dee0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
2def0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
2df00 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
2df10 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
2df20 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
2df30 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
2df40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
2df50 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
2df60 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
2df70 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
2df80 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
2df90 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
2dfa0 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
2dfb0 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
2dfc0 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
2dfd0 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
2dfe0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
2dff0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
2e000 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
2e010 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
2e020 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
2e030 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
2e040 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
2e050 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
2e060 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
2e070 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
2e080 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
2e090 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
2e0a0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
2e0b0 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
2e0c0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
2e0d0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
2e0e0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
2e0f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
2e100 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
2e110 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
2e120 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
2e130 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
2e140 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
2e150 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
2e160 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2e170 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
2e180 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
2e190 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
2e1a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
2e1b0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
2e1c0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2e1d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2e1e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2e1f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
2e200 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
2e210 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
2e220 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
2e230 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
2e240 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
2e250 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
2e260 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
2e270 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
2e280 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
2e290 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
2e2a0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
2e2b0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
2e2c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2e2d0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
2e2e0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
2e2f0 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
2e300 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
2e310 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Bt;.  int rc;.. 
2e320 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2e330 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2e340 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2e350 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2e360 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2e370 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2e380 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
2e390 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
2e3a0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2e3b0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2e3c0 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
2e3d0 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
2e3e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2e3f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2e400 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
2e410 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2e420 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e430 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2e440 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2e450 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  l);.  pCur->aiId
2e460 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2e470 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
2e480 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e490 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70  iPage] = pCur->p
2e4a0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78  Page;.  pCur->ix
2e4b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
2e4c0 61 67 65 2b 2b 3b 0a 20 20 72 63 20 3d 20 67 65  age++;.  rc = ge
2e4d0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2e4e0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72  , newPgno, &pCur
2e4f0 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20  ->pPage,.       
2e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e510 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72   pCur, pCur->cur
2e520 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 69  PagerFlags);.  i
2e530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e540 20 29 7b 0a 20 20 20 20 73 65 74 4d 65 6d 70 61   ){.    setMempa
2e550 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70 50 61  geRoot(pCur->pPa
2e560 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ge, pCur->pgnoRo
2e570 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ot);.  }.  retur
2e580 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
2e590 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2e5a0 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
2e5b0 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
2e5c0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
2e5d0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
2e5e0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
2e5f0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
2e600 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
2e610 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
2e620 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
2e630 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
2e640 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
2e650 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
2e660 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
2e670 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2e680 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
2e690 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
2e6a0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
2e6b0 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
2e6c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
2e6d0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
2e6e0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2e6f0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
2e700 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f  Child){.  if( CO
2e710 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
2e720 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69  n;  /* The condi
2e730 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c  tions tested bel
2e740 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ow might not be 
2e750 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  true.           
2e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e770 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
2e780 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
2e790 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
2e7a0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
2e7b0 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
2e7c0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
2e7d0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
2e7e0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2e7f0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2e800 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
2e810 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2e820 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
2e830 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
2e840 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
2e850 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
2e860 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
2e870 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
2e880 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
2e890 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2e8a0 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
2e8b0 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
2e8c0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
2e8d0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
2e8e0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
2e8f0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
2e900 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
2e910 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
2e920 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
2e930 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
2e940 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
2e950 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
2e960 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
2e970 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
2e980 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
2e990 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
2e9a0 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
2e9b0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
2e9c0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2e9d0 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20  Leaf;.  assert( 
2e9e0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2e9f0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ea00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2ea10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2ea20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ea30 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
2ea40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2ea50 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
2ea60 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
2ea70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ea80 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
2ea90 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2eaa0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
2eab0 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d      pCur->pPage-
2eac0 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73  >pgno.  );.  tes
2ead0 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49  tcase( pCur->aiI
2eae0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2eaf0 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ] > pCur->apPage
2eb00 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d  [pCur->iPage-1]-
2eb10 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72  >nCell );.  pCur
2eb20 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2eb30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2eb40 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2eb50 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2eb60 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
2eb70 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  ix = pCur->aiIdx
2eb80 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
2eb90 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d  .  pLeaf = pCur-
2eba0 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
2ebb0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2ebc0 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61  Page[--pCur->iPa
2ebd0 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge];.  releasePa
2ebe0 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29  geNotNull(pLeaf)
2ebf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2ec00 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
2ec10 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
2ec20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
2ec30 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
2ec40 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
2ec50 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
2ec60 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
2ec70 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
2ec80 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
2ec90 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
2eca0 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
2ecb0 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
2ecc0 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
2ecd0 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
2ece0 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
2ecf0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2ed00 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2ed10 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
2ed20 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
2ed30 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
2ed40 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
2ed50 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2ed60 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
2ed70 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
2ed80 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
2ed90 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
2eda0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
2edb0 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
2edc0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
2edd0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
2ede0 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73  _EMPTY. Otherwis
2edf0 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  e,.** the cursor
2ee00 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
2ee10 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 65   to the first ce
2ee20 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
2ee30 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69  e root.** (or vi
2ee40 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
2ee50 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2ee60 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2ee70 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
2ee80 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
2ee90 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
2eea0 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
2eeb0 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
2eec0 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
2eed0 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
2eee0 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
2eef0 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
2ef00 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
2ef10 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
2ef20 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
2ef30 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
2ef40 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
2ef50 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
2ef60 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
2ef70 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
2ef80 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
2ef90 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
2efa0 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
2efb0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
2efc0 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
2efd0 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
2efe0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
2eff0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
2f000 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
2f010 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
2f020 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
2f030 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
2f040 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2f050 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
2f060 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2f070 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
2f080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2f090 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f0a0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f0b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f0c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
2f0d0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2f0e0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2f0f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
2f100 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2f110 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2f120 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
2f130 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
2f140 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2f150 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  t( pCur->eState 
2f160 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2f170 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50  SEEK || pCur->iP
2f180 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  age<0 );.  asser
2f190 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2f1a0 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  t>0 || pCur->iPa
2f1b0 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge<0 );..  if( p
2f1c0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
2f1d0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
2f1e0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Page ){.      re
2f1f0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2f200 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2f210 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43       while( --pC
2f220 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2f230 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f240 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
2f250 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2f260 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2f270 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
2f280 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2f290 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70  .      goto skip
2f2a0 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  _init;.    }.  }
2f2b0 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70  else if( pCur->p
2f2c0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  gnoRoot==0 ){.  
2f2d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f2e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2f2f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2f300 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73  TE_EMPTY;.  }els
2f310 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2f320 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29  Cur->iPage==(-1)
2f330 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
2f340 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
2f350 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
2f360 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2f370 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2f380 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AULT ){.        
2f390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2f3a0 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
2f3b0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  K );.        ret
2f3c0 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
2f3d0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2f3e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
2f3f0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
2f400 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2f410 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2f420 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
2f430 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2f440 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a  , &pCur->pPage,.
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d          0, pCur-
2f470 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
2f480 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f4a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f4b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2f4c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f4d0 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4d 65 6d      }.    setMem
2f4e0 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70  pageRoot(pCur->p
2f4f0 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  Page, pCur->pgno
2f500 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43 75 72 2d  Root);.    pCur-
2f510 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
2f520 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2f530 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  = pCur->pPage->i
2f540 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
2f550 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2f560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
2f570 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
2f580 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
2f590 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
2f5a0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
2f5b0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
2f5c0 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
2f5d0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
2f5e0 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
2f5f0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
2f600 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
2f610 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
2f620 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
2f630 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
2f640 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
2f650 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2f660 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
2f670 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
2f680 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
2f690 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
2f6a0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2f6b0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2f6c0 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
2f6d0 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
2f6e0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
2f6f0 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2f700 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2f710 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
2f720 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
2f730 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
2f740 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
2f750 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2f760 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
2f770 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
2f780 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
2f790 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
2f7a0 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
2f7b0 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
2f7c0 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
2f7d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
2f7e0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
2f7f0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2f800 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
2f810 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
2f820 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2f830 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
2f840 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2f850 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2f860 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29  AGE(pCur->pPage)
2f870 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74  ;.  }..skip_init
2f880 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  :  .  pCur->ix =
2f890 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
2f8a0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2f8b0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2f8c0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2f8d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2f8e0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
2f8f0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2f900 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
2f910 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
2f920 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f930 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2f940 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
2f950 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
2f960 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
2f970 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
2f980 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
2f990 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f9a0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
2f9b0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
2f9c0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
2f9d0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2f9e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2f9f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2fa00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2fa10 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
2fa20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2fa30 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2fa40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2fa50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2fa60 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  MPTY;.  }.  retu
2fa70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fa80 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2fa90 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2faa0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2fab0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2fac0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2fad0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2fae0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2faf0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2fb00 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2fb10 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2fb20 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2fb30 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2fb40 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2fb50 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2fb60 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2fb70 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2fb80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2fb90 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2fba0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2fbb0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2fbc0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2fbd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fbe0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2fbf0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2fc00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2fc10 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2fc20 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2fc30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2fc40 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2fc50 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
2fc60 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2fc70 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2fc80 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >ix));.    rc = 
2fc90 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2fca0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
2fcb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fcc0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2fcd0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
2fce0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
2fcf0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2fd00 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
2fd10 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2fd20 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
2fd30 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
2fd40 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
2fd50 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
2fd60 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
2fd70 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
2fd80 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2fd90 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
2fda0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2fdb0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
2fdc0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2fdd0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2fde0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2fdf0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
2fe00 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
2fe10 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2fe20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2fe30 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2fe40 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
2fe50 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
2fe60 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2fe70 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
2fe80 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2fe90 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2fea0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2feb0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2fec0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
2fed0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2fee0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2fef0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2ff00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2ff10 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2ff20 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
2ff30 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2ff40 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2ff50 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ff60 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ff70 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2ff80 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2ff90 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2ffa0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2ffb0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2ffc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ffd0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2ffe0 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2fff0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
30000 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
30010 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
30020 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
30030 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
30040 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
30050 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30060 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
30070 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
30080 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
30090 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
300a0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
300b0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
300c0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
300d0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
300e0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
300f0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
30100 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
30110 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
30120 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
30130 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
30140 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
30150 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
30160 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
30170 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
30180 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30190 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
301a0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
301b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
301c0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
301d0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
301e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
301f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
30200 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
30210 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
30220 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
30230 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
30240 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
30250 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
30260 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
30270 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
30280 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
30290 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
302a0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
302b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
302c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
302d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
302e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
302f0 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f 65 73  cursor pCur does
30300 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20   not point to a 
30310 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f 74  valid row..** Ot
30320 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72  herwise, if pCur
30330 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66 69   is valid, confi
30340 67 75 72 65 20 69 74 20 73 6f 20 74 68 61 74 20  gure it so that 
30350 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
30360 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
30370 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Next() is a no-o
30380 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  p..*/.#ifndef SQ
30390 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
303a0 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74 65  FUNC.void sqlite
303b0 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74 28 42  3BtreeSkipNext(B
303c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
303d0 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76 65 20    /* We believe 
303e0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
303f0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 69  must always be i
30400 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74 61 74  n the valid stat
30410 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 69 73  e when.  ** this
30420 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
30430 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 6f 6f  ed, but the proo
30440 66 20 69 73 20 64 69 66 66 69 63 75 6c 74 2c 20  f is difficult, 
30450 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20 20 2a  so we add an.  *
30460 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73 74 20  * ALWaYS() test 
30470 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77 65 20  just in case we 
30480 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20 20  are wrong. */.  
30490 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
304a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
304b0 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 43  VALID) ){.    pC
304c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
304d0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
304e0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
304f0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 1;.  }.}.#end
30500 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
30510 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
30520 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
30530 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
30540 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
30550 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
30560 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
30570 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
30580 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
30590 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
305a0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
305b0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
305c0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
305d0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
305e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
305f0 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
30600 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
30610 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
30620 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
30630 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
30640 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30650 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
30660 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
30670 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
30680 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
30690 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
306a0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
306b0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
306c0 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
306d0 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
306e0 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
306f0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
30700 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
30710 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
30720 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
30730 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
30740 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
30750 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
30760 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
30770 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
30780 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
30790 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
307a0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
307b0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
307c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
307d0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
307e0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
307f0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
30800 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
30810 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72  ( pCur->ix==pCur
30820 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  ->pPage->nCell-1
30830 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30840 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
30850 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
30860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30870 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
30880 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
30890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
308a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
308b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
308c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
308d0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
308e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
308f0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
30900 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
30920 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
30930 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
30940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
30950 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
30960 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
30970 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
30980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
30990 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
309a0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
309b0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
309c0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
309d0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
309e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
309f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
30a00 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
30a10 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
30a20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
30a30 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
30a40 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
30a50 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
30a60 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
30a70 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
30a80 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
30a90 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
30aa0 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
30ab0 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
30ac0 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
30ad0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
30ae0 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
30af0 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
30b00 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
30b10 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
30b20 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
30b30 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
30b40 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
30b50 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
30b60 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
30b70 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
30b80 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
30b90 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
30ba0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
30bb0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
30bc0 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
30bd0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
30be0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
30bf0 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
30c00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
30c10 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
30c20 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
30c30 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
30c40 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
30c50 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
30c60 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
30c70 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
30c80 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
30c90 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
30ca0 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
30cb0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
30cc0 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
30cd0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
30ce0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
30cf0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
30d00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
30d10 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
30d20 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
30d30 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
30d40 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
30d50 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
30d60 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
30d70 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
30d80 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
30d90 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
30da0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
30db0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
30dc0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
30dd0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
30de0 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
30df0 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
30e00 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
30e10 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
30e20 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
30e30 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
30e40 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
30e50 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
30e60 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
30e70 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
30e80 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
30e90 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e  s, the pIdxKey->
30ea0 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20  eqSeen field is 
30eb0 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72  set to 1 if ther
30ec0 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65  e.** exists an e
30ed0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
30ee0 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d  e that exactly m
30ef0 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20  atches pIdxKey. 
30f00 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
30f10 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
30f20 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
30f30 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
30f40 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
30f50 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
30f60 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
30f70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
30f80 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
30f90 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
30fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30fb0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
30fc0 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
30fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
30fe0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
30ff0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
31000 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
31010 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
31020 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
31030 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
31040 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
31050 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
31060 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
31070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
31080 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
31090 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
310a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
310b0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
310c0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
310d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
310e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
310f0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
31100 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
31110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
31120 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
31130 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78  R_VALID || (pIdx
31140 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
31150 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b  curIntKey!=0) );
31160 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
31170 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
31180 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
31190 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
311a0 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
311b0 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
311c0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
311d0 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
311e0 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d  /.  if( pIdxKey=
311f0 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65  =0.   && pCur->e
31200 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
31210 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
31220 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
31230 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b  lidNKey)!=0.  ){
31240 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
31250 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
31260 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
31270 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
31280 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
31290 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
312a0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
312b0 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  y ){.      if( (
312c0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
312d0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
312e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
312f0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  s = -1;.        
31300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31320 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  /* If the reques
31330 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d  ted key is one m
31340 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65  ore than the pre
31350 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a  vious key, then.
31360 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20        ** try to 
31370 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20  get there using 
31380 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
31390 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  () rather than a
313a0 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62   full.      ** b
313b0 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54  inary search.  T
313c0 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
313d0 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68  zation only.  Th
313e0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
313f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
31400 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68  ll obtained with
31410 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f  out this case, o
31420 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72  nly a little mor
31430 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20  e slowely */.   
31440 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
31450 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79  o.nKey+1==intKey
31460 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
31470 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
31480 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
31490 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20  Next(pCur, 0);. 
314a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
314b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
314c0 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
314d0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20  o(pCur);.       
314e0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
314f0 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
31500 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
31510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
31540 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
31550 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
31570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31580 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
315a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
315b0 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
315c0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
315d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
315e0 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
315f0 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
31600 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
31610 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
31620 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
31630 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
31640 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
31650 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
31660 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
31670 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
31680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
31690 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
316a0 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
316b0 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
316c0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
316d0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
316e0 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
316f0 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  c==SQLITE_EMPTY 
31700 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
31710 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
31720 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
31730 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
31740 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
31750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
31760 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
31770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31780 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
31790 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
317a0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
317b0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
317c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
317d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
317e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
317f0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
31800 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74   > 0 );.  assert
31810 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
31820 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
31830 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75  [0]->intKey==pCu
31840 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
31850 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
31860 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64  curIntKey || pId
31870 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
31880 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
31890 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
318a0 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
318b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
318c0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
318d0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
318e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
31900 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
31910 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
31920 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
31930 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
31940 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
31950 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
31960 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
31970 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
31980 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
31990 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
319a0 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
319b0 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
319c0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
319d0 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
319e0 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
319f0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
31a00 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
31a10 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
31a20 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
31a30 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
31a40 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
31a50 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
31a60 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
31a70 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
31a80 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
31a90 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
31aa0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
31ab0 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
31ac0 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
31ad0 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
31ae0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
31af0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
31b00 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
31b10 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
31b20 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
31b30 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
31b40 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
31b50 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
31b60 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
31b70 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
31b80 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
31b90 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
31ba0 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
31bb0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
31bc0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
31bd0 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
31be0 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
31bf0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
31c00 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
31c10 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
31c20 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
31c30 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
31c40 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
31c50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
31c60 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
31c70 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
31c80 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
31c90 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
31ca0 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
31cb0 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
31cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31cd0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
31ce0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
31d00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31d10 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
31d20 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
31d30 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
31d40 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
31d50 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
31d60 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
31d70 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
31d80 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
31d90 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
31da0 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
31db0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
31dc0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
31dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31de0 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
31df0 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
31e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31e10 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
31e20 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
31e30 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
31e40 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
31e50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
31e60 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31e70 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
31e80 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
31e90 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
31ea0 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
31eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31ec0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
31ed0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
31ee0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
31ef0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
31f00 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
31f10 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
31f20 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
31f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
31f40 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
31f50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31f60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31f70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31f80 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
31f90 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
31fa0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
31fb0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
31fc0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
31fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
31fe0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
31ff0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
32000 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
32010 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
32020 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
32030 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
32040 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
32050 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
32060 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
32070 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
32080 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
32090 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
320a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
320b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
320c0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
320d0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
320e0 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
320f0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
32100 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
32110 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
32120 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
32130 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
32140 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
32150 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
32160 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
32170 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
32180 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
32190 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
321a0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
321b0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
321c0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
321d0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
321e0 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
321f0 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
32200 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
32210 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
32220 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
32230 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
32240 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
32250 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
32260 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
32270 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
32280 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
32290 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
322a0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
322b0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
322c0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
322d0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
322e0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
322f0 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
32300 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
32310 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
32320 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
32330 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
32340 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
32350 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
32360 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
32370 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
32380 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
32390 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
323a0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
323b0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
323c0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
323d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
323e0 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
323f0 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
32400 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
32410 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
32420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32430 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
32440 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
32450 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
32460 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
32470 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
32480 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
32490 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
324a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
324b0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
324c0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
324d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
324e0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
324f0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
32500 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
32510 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
32520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
32530 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
32540 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
32550 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
32560 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
32570 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
32580 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
32590 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
325a0 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
325b0 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
325c0 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
325d0 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
325e0 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
325f0 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
32600 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
32610 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
32620 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
32630 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
32640 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32650 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
32660 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
32670 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
32680 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
32690 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
326a0 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
326b0 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
326c0 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
326d0 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
326e0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
326f0 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
32700 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
32710 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
32720 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
32730 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
32740 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
32750 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
32760 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
32770 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
32780 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
32790 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
327a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
327b0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
327c0 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
327d0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
327e0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
327f0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
32800 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
32810 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
32820 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
32830 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
32840 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
32850 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
32860 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
32870 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
32880 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
32890 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
328a0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
328b0 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
328c0 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
328d0 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
328e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
328f0 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
32900 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
32910 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
32920 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
32930 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f  Cell<2 || nCell/
32940 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  pCur->pBt->usabl
32950 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d  eSize>pCur->pBt-
32960 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
32970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32980 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
32990 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
329a0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
329b0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
329c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
329d0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
329e0 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
329f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32a00 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
32a10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32a20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
32a30 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
32a40 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
32a50 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
32a60 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
32a70 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
32a80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
32a90 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
32aa0 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
32ab0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
32ac0 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
32ad0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
32ae0 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
32af0 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20  dOvfl;.         
32b00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
32b20 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
32b30 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32b40 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
32b50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32b60 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
32b70 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
32b80 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
32b90 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
32ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
32bb0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
32bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32bd0 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
32be0 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
32bf0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
32c00 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
32c10 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
32c20 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
32c30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
32c40 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
32c50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
32c60 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
32c70 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
32c80 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
32c90 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
32ca0 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
32cb0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
32cc0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
32cd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
32ce0 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
32cf0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
32d00 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
32d10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
32d20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
32d30 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
32d40 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
32d50 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
32d60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32d70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
32d80 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
32d90 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
32da0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
32db0 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
32dc0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
32dd0 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
32de0 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
32df0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
32e00 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
32e10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32e20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
32e30 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
32e40 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
32e50 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
32e60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
32e70 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
32e80 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
32e90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
32ea0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
32eb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
32ec0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
32ed0 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
32ee0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
32ef0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
32f00 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
32f10 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
32f20 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
32f30 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
32f40 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
32f50 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
32f60 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
32f70 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
32f80 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
32f90 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
32fa0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
32fb0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
32fc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
32fd0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72  r->ix = (u16)lwr
32fe0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
32ff0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
33000 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
33010 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
33020 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
33030 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
33040 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28  = 0;.  assert( (
33050 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
33060 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
33070 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
33080 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
33090 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
330a0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
330b0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
330c0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
330d0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
330e0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
330f0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
33100 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
33110 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
33120 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
33130 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
33140 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
33150 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
33160 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
33170 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
33180 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
33190 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
331a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
331b0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
331c0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
331d0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
331e0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
331f0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
33200 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
33210 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
33220 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
33230 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
33240 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
33250 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
33260 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
33270 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
33280 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
33290 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
332a0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
332b0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
332c0 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74  eturn an estimat
332d0 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  e for the number
332e0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
332f0 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20  table that pCur 
33300 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
33310 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  o.  Return a neg
33320 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
33330 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  no estimate is c
33340 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61  urrently .** ava
33350 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73  ilable..*/.i64 s
33360 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f  qlite3BtreeRowCo
33370 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20  untEst(BtCursor 
33380 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b  *pCur){.  i64 n;
33390 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65  .  u8 i;..  asse
333a0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
333b0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
333c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
333d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
333e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
333f0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  utex) );..  /* C
33400 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e  urrently this in
33410 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20  terface is only 
33420 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50  called by the OP
33430 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20  _IfSmaller.  ** 
33440 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74  opcode, and it t
33450 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72  hat case the cur
33460 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  sor will always 
33470 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a  be valid and.  *
33480 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f  * will always po
33490 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f  int to a leaf no
334a0 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  de. */.  if( NEV
334b0 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21  ER(pCur->eState!
334c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
334d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66   return -1;.  if
334e0 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70 50  ( NEVER(pCur->pP
334f0 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20  age->leaf==0) ) 
33500 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20  return -1;..  n 
33510 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  = pCur->pPage->n
33520 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Cell;.  for(i=0;
33530 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   i<pCur->iPage; 
33540 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70  i++){.    n *= p
33550 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
33560 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  nCell;.  }.  ret
33570 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
33580 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
33590 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
335a0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
335b0 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e  base. .** Return
335c0 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
335d0 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
335e0 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
335f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 20  SQLITE_DONE     
33600 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
33610 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  dy pointing at t
33620 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a  he last element.
33630 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  **    otherwise 
33640 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64         some kind
33650 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
33660 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
33670 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
33680 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
33690 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
336a0 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
336b0 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
336c0 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
336d0 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
336e0 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
336f0 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
33700 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
33710 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
33720 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
33730 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
33740 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
33750 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
33760 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
33770 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
33780 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
33790 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
337a0 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
337b0 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
337c0 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69  the F argument i
337d0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
337e0 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  xt(C,F) is 1, th
337f0 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  en the.** cursor
33800 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
33810 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
33820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
33830 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
33840 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
33850 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
33860 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
33870 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
33880 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74 20  nt.** is a hint 
33890 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
338a0 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  .  SQLite btree 
338b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
338c0 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74  oes not use.** t
338d0 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
338e0 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
338f0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
33900 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
33910 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
33920 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
33930 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
33940 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
33950 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
33960 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
33970 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
33980 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
33990 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
339a0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
339b0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
339c0 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
339d0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
339e0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
339f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
33a10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
33a20 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
33a30 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
33a40 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  tate ){.      re
33a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
33a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33a70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
33a80 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
33a90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
33aa0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
33ab0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
33ac0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
33ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33ae0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
33af0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
33b00 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  age;.  idx = ++p
33b10 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66 28 20 21  Cur->ix;.  if( !
33b20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
33b30 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79  .    /* The only
33b40 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f 72 20 74   known way for t
33b50 68 69 73 20 74 6f 20 68 61 70 70 65 6e 20 69 73  his to happen is
33b60 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
33b70 20 61 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73   a.    ** recurs
33b80 69 76 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ive SQL function
33b90 20 74 68 61 74 20 64 6f 65 73 20 61 20 44 45 4c   that does a DEL
33ba0 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  ETE operation as
33bb0 20 70 61 72 74 20 6f 66 20 61 0a 20 20 20 20 2a   part of a.    *
33bc0 2a 20 53 45 4c 45 43 54 20 77 68 69 63 68 20 64  * SELECT which d
33bd0 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e 74 20 6f  eletes content o
33be0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 61 6e  ut from under an
33bf0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 0a 20   active cursor. 
33c00 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
33c10 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
33c20 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
33c30 20 62 65 69 6e 67 20 44 45 4c 45 54 45 2d 65 64   being DELETE-ed
33c40 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 68 61 73   from.    ** has
33c50 20 70 61 67 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e   pages in common
33c60 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
33c70 62 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20 20  being queried.  
33c80 53 65 65 20 54 48 33 0a 20 20 20 20 2a 2a 20 6d  See TH3.    ** m
33c90 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74 72 65 65  odule cov1/btree
33ca0 37 38 2e 74 65 73 74 20 74 65 73 74 63 61 73 65  78.test testcase
33cb0 20 32 32 30 20 28 32 30 31 38 2d 30 36 2d 30 38   220 (2018-06-08
33cc0 29 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ) for an.    ** 
33cd0 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20 20  example. */.    
33ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
33cf0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
33d00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
33d10 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
33d20 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
33d30 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
33d40 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
33d50 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
33d60 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
33d70 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
33d80 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
33d90 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
33da0 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
33db0 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
33dc0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
33dd0 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
33de0 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
33df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
33e00 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
33e10 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
33e20 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
33e30 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
33e40 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
33e50 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
33e60 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
33e70 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
33e80 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
33e90 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
33ea0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
33eb0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
33ec0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
33ed0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
33ee0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
33ef0 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
33f00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33f10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
33f20 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
33f30 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
33f40 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
33f50 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
33f60 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
33f70 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
33f80 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
33f90 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
33fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
33fb0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
33fc0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
33fd0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
33fe0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
33ff0 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ix>=pPage->nCell
34000 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
34010 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
34020 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
34030 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
34040 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
34050 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
34060 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
34070 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
34080 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
34090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
340a0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
340b0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
340c0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
340d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
340e0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
340f0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
34100 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
34110 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34120 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
34130 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
34140 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
34150 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72  QLite */.  asser
34160 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
34170 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
34180 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
34190 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b  0 || flags==1 );
341a0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
341b0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
341c0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
341d0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
341e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
341f0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
34200 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
34210 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
34220 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  xt(pCur);.  pPag
34230 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
34240 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
34250 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ix)>=pPage->nCel
34260 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l ){.    pCur->i
34270 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x--;.    return 
34280 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b  btreeNext(pCur);
34290 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
342a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
342b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
342c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
342d0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
342e0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
342f0 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
34300 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
34310 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
34320 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
34330 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74  database..** Ret
34340 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
34350 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  *     SQLITE_OK 
34360 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20      success.**  
34370 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
34380 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
34390 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69  lready on the fi
343a0 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  rst element of t
343b0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
343c0 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 73 6f  otherwise     so
343d0 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  me kind of error
343e0 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20   occurred.**.** 
343f0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
34400 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
34410 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
34420 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
34430 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
34440 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
34450 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
34460 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
34470 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
34480 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
34490 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
344a0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
344b0 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
344c0 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
344d0 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
344e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
344f0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
34500 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
34510 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
34520 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
34530 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
34540 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
34550 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
34560 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  t to sqlite3Btre
34570 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69  ePrevious(C,F) i
34580 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  s 1, then.** the
34590 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
345a0 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
345b0 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75  dex and this rou
345c0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
345d0 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20  been.** skipped 
345e0 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78  if the SQL index
345f0 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71   had been a uniq
34600 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46  ue index.  The F
34610 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
34620 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  * hint to the im
34630 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61  plement.  The na
34640 74 69 76 65 20 53 51 4c 69 74 65 20 62 74 72 65  tive SQLite btre
34650 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
34660 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65   does not.** use
34670 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20   this hint, but 
34680 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a  COMDB2 does..*/.
34690 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
346a0 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
346b0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
346c0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
346d0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
346e0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
346f0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
34700 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
34710 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
34720 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
34730 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
34740 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
34750 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
34760 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
34770 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
34780 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
34790 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
347a0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
347b0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
347c0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
347d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
347e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
347f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
34800 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
34810 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
34820 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34830 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
34840 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 53 4b     if( CURSOR_SK
34850 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
34860 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 70 43  tate ){.      pC
34870 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
34880 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
34890 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
348a0 65 78 74 3c 30 20 29 20 72 65 74 75 72 6e 20 53  ext<0 ) return S
348b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
348c0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
348d0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
348e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
348f0 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
34900 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34910 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
34920 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  >ix;.    rc = mo
34930 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
34940 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
34950 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
34960 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
34970 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
34980 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
34990 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
349a0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
349b0 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  r->ix==0 ){.    
349c0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
349d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
349e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
349f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
34a00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
34a10 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
34a20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
34a30 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
34a40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
34a50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
34a60 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
34a70 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
34a80 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f  s & (BTCF_ValidO
34a90 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
34aa0 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
34ab0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
34ac0 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Page;.    if( pP
34ad0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
34ae0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
34af0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34b00 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
34b10 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
34b20 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
34b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
34b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
34b50 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
34b60 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
34b70 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
34b80 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
34b90 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
34ba0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
34bb0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
34bc0 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
34bd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34be0 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
34bf0 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
34c00 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
34c10 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d  QLite */.  pCur-
34c20 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
34c30 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
34c40 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
34c50 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75  alidNKey);.  pCu
34c60 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
34c70 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
34c80 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
34c90 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  LID.   || pCur->
34ca0 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72  ix==0.   || pCur
34cb0 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ->pPage->leaf==0
34cc0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
34cd0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
34ce0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Cur);.  }.  pCur
34cf0 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  ->ix--;.  return
34d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34d10 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
34d20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
34d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34d40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
34d50 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
34d60 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
34d70 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
34d80 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
34d90 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
34da0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
34db0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
34dc0 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
34dd0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
34de0 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
34df0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
34e00 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
34e10 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
34e20 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
34e30 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
34e40 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
34e50 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
34e60 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
34e70 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
34e80 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
34e90 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
34ea0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
34eb0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
34ec0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
34ed0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  n error..**.** I
34ee0 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
34ef0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
34f00 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
34f10 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
34f20 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
34f30 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
34f40 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
34f50 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
34f60 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
34f70 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
34f80 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
34f90 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
34fa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34fb0 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
34fc0 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
34fd0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
34fe0 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
34ff0 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
35000 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
35010 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
35020 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
35030 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
35040 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
35050 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
35060 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
35070 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
35080 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
35090 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
350a0 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
350b0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
350c0 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
350d0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
350e0 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
350f0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
35100 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
35110 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
35120 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
35130 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
35140 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
35150 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
35160 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
35170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
35180 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
35190 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
351a0 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
351b0 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
351c0 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
351d0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
351e0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
351f0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
35200 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
35210 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
35220 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
35230 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
35240 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
35250 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
35260 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
35270 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
35280 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
35290 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
352a0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
352b0 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
352c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
352d0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
352e0 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
352f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
35300 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
35310 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
35320 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
35330 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
35340 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
35350 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
35360 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
35370 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
35380 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
35390 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
353a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
353b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
353c0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
353d0 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
353e0 61 72 62 79 3e 30 20 26 26 20 52 45 51 55 49 52  arby>0 && REQUIR
353f0 45 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20 20  E_PTRMAP ) );.  
35400 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
35410 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
35420 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
35430 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
35440 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
35450 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
35460 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
35470 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
35480 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
35490 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
354a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
354b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
354c0 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
354d0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
354e0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
354f0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
35500 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
35510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
35520 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35530 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e  PT;.  }..  /* En
35540 73 75 72 65 20 70 61 67 65 20 31 20 69 73 20 77  sure page 1 is w
35550 72 69 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  ritable. This fu
35560 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68  nction will eith
35570 65 72 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75  er change the nu
35580 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67  mber.  ** of pag
35590 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  es in the free-l
355a0 69 73 74 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ist or the size 
355b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
355c0 66 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f 74 68  file. Since both
355d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f  .  ** of these o
355e0 70 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76  perations involv
355f0 65 20 6d 6f 64 69 66 79 69 6e 67 20 70 61 67 65  e modifying page
35600 20 31 20 68 65 61 64 65 72 20 66 69 65 6c 64 73   1 header fields
35610 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a 20 77 69  , page 1.  ** wi
35620 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79 20 62 65  ll definitely be
35630 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 69 73   written by this
35640 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
35650 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e 43   this is an CONC
35660 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74 72 61 6e  URRENT.  ** tran
35670 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20  saction, ensure 
35680 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70 20  the BtreePtrmap 
35690 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
356a0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a  en allocated.  *
356b0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
356c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
356d0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
356e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
356f0 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  c;..  if( n>0 ){
35700 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
35710 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
35720 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
35730 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
35740 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
35750 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
35760 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
35770 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
35780 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
35790 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
357a0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
357b0 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
357c0 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
357d0 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
357e0 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
357f0 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
35800 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
35810 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
35820 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
35830 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
35840 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
35850 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
35860 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
35870 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
35880 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
35890 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
358a0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
358b0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
358c0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
358d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
358e0 53 41 55 54 4f 56 41 43 55 55 4d 21 3d 49 53 43  SAUTOVACUUM!=ISC
358f0 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a 20 20 20  ONCURRENT );.   
35900 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
35910 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UUM ){.        i
35920 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
35930 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  e ){.          u
35940 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
35950 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
35960 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  y>0 );.         
35970 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
35980 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
35990 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
359a0 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
359b0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
359c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
359d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
359e0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
359f0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
35a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35a10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
35a20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35a30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
35a40 65 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  e{.        searc
35a50 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
35a60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
35a70 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
35a80 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
35a90 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
35aa0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
35ab0 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
35ac0 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
35ad0 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
35ae0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
35af0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
35b00 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
35b10 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
35b20 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
35b30 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
35b40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
35b50 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
35b60 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
35b70 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
35b80 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
35b90 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
35ba0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
35bb0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
35bc0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
35bd0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
35be0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
35bf0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
35c00 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
35c10 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
35c20 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
35c30 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
35c40 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
35c50 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
35c60 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
35c70 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
35c80 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
35c90 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
35ca0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
35cb0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
35cc0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
35cd0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
35ce0 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
35cf0 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
35d00 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
35d10 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
35d20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
35d30 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
35d40 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
35d50 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
35d60 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
35d70 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
35d80 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
35d90 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
35da0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
35db0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
35dc0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
35dd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35de0 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
35df0 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
35e00 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
35e10 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
35e20 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
35e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
35e40 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
35e50 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
35e60 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
35e70 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
35e80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
35e90 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
35ea0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
35eb0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
35ec0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
35ed0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
35ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
35ef0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
35f00 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
35f10 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
35f20 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
35f30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
35f40 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65  ORRUPT_PGNO(pPre
35f50 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72  vTrunk ? pPrevTr
35f60 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a  unk->pgno : 1);.
35f70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35f80 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
35f90 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
35fa0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
35fb0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
35fc0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
35fd0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
35fe0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
35ff0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
36000 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
36010 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
36020 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
36030 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
36040 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
36050 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
36060 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
36070 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
36080 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
36090 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
360a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
360b0 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
360c0 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
360d0 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
360e0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
360f0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
36100 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
36110 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
36120 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
36130 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
36140 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
36150 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
36160 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
36170 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
36180 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
36190 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
361a0 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
361b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
361c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
361d0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
361e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
361f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36200 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
36210 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
36220 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36230 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
36240 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
36250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
36260 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
36270 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
36280 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
36290 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
362a0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
362b0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
362c0 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
362d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
362e0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
362f0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
36300 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
36310 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
36320 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36330 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
36340 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
36350 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
36360 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
36370 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
36380 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
36390 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
363a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
363b0 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
363c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
363d0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
363e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
363f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
36400 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
36410 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
36420 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
36430 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
36440 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
36450 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
36460 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
36470 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
36480 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
36490 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
364a0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
364b0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
364c0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
364d0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
364e0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
364f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
36500 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
36510 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
36520 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
36530 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
36540 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
36550 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36560 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
36570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36580 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
36590 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
365a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
365b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
365c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
365d0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
365e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
365f0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
36600 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
36610 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
36620 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
36630 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
36640 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36650 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
36660 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
36670 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36690 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
366a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
366b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
366c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
366d0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
366e0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
366f0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
36700 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36720 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
36730 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
36740 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
36750 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
36760 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
36770 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
36780 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
36790 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
367a0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
367b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
367c0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
367d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
367e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
367f0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
36800 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
36810 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
36820 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
36830 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
36840 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
36850 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
36860 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
36870 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
36880 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
36890 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
368a0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
368b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
368c0 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
368d0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
368e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
368f0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
36900 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
36910 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
36920 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36940 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
36950 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
36960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36980 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
36990 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
369a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
369b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
369c0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
369d0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
369e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
369f0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
36a00 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
36a10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
36a20 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
36a30 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
36a40 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
36a50 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
36a60 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
36a70 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
36a80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
36a90 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
36aa0 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
36ab0 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
36ac0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
36ad0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
36ae0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
36af0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
36b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36b10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36b20 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36b30 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
36b40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
36b50 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
36b60 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
36b70 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
36b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36b90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36ba0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
36bb0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
36bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
36bd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36be0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
36bf0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
36c00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
36c10 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
36c20 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
36c30 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
36c40 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
36c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36c60 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
36c70 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
36c80 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
36c90 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
36ca0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
36cb0 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
36cc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36cd0 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
36ce0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
36cf0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
36d00 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
36d10 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
36d20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
36d30 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
36d40 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
36d50 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
36d60 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
36d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
36d80 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
36d90 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
36da0 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
36db0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
36dc0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
36dd0 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
36de0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
36df0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
36e00 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
36e10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
36e20 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
36e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e40 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
36e50 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
36e60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
36e70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
36e80 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
36e90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
36ea0 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
36eb0 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
36ec0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
36ed0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
36ee0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
36ef0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
36f00 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
36f10 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
36f20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
36f30 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
36f40 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
36f50 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
36f60 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
36f70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
36f80 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
36f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
36fa0 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
36fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
36fe0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
36ff0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
37000 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
37010 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
37020 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
37030 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
37040 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
37050 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
37060 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
37070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
37080 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
37090 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
370a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
370b0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
370c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
370d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
370e0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
370f0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
37100 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
37110 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
37120 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
37130 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
37140 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
37150 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
37160 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
37170 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
37180 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
37190 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
371a0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
371b0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
371c0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
371d0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
371e0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
371f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37200 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
37210 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
37220 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
37230 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37240 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37250 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
37260 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
37270 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
37280 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
37290 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
372a0 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
372b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
372c0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
372d0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
372e0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
372f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
37300 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
37310 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
37320 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
37330 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
37340 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
37350 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
37360 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
37370 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
37380 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
37390 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
373a0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
373b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
373c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
373d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
373e0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
373f0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
37400 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
37410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
37430 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
37440 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
37450 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
37460 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
37470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37480 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
37490 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
374a0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
374b0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
374c0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
374d0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
374e0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
374f0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
37500 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
37510 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
37520 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
37530 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
37540 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
37550 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
37560 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
37570 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
37580 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
37590 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
375a0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
375b0 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
375c0 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
375d0 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
375e0 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
375f0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
37600 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
37610 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
37620 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
37630 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
37640 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
37650 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
37660 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
37670 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
37680 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
37690 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
376a0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
376b0 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
376c0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
376d0 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
376e0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
376f0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
37700 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
37710 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
37720 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
37730 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
37740 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
37750 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
37760 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
37770 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
37780 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
37790 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
377a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
377b0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
377c0 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
377d0 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
377e0 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
377f0 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
37800 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
37810 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
37820 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
37830 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
37840 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
37850 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
37860 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
37870 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
37880 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
37890 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
378a0 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
378b0 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
378c0 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
378d0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
378e0 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
378f0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
37900 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
37910 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
37920 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
37930 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
37940 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
37950 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
37960 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
37970 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
37980 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
37990 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
379a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
379b0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
379c0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
379d0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
379e0 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
379f0 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
37a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37a10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
37a20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
37a30 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
37a40 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
37a50 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
37a60 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
37a70 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
37a80 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
37a90 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
37aa0 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
37ab0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
37ac0 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
37ad0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
37ae0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
37af0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
37b00 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
37b10 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
37b20 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
37b30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37b40 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
37b50 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
37b60 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
37b70 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
37b80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
37b90 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
37ba0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
37bb0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
37bc0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
37bd0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
37be0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
37bf0 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  dPage(pBt, pBt->
37c00 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
37c10 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
37c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37c30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
37c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37c50 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
37c60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
37c70 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
37c80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
37c90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
37ca0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
37cb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
37cc0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
37cd0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
37ce0 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
37cf0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
37d00 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
37d10 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
37d20 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
37d30 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
37d40 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
37d50 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
37d60 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
37d70 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
37d80 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
37d90 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
37da0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
37db0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
37dc0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37dd0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
37de0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37df0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
37e00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
37e10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37e20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37e30 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
37e40 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
37e50 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
37e60 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
37e70 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
37e80 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
37e90 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
37ea0 50 54 5f 44 42 20 7c 7c 20 2a 70 50 67 6e 6f 21  PT_DB || *pPgno!
37eb0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37ec0 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
37ed0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
37ee0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
37ef0 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
37f00 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
37f10 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
37f20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
37f30 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
37f40 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
37f50 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20  pDbPage)<=1 );. 
37f60 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
37f70 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61  ITE_OK || (*ppPa
37f80 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
37f90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37fa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
37fb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
37fc0 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
37fd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
37fe0 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
37ff0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
38000 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
38010 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
38020 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
38030 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
38040 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
38050 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
38060 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
38070 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
38080 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
38090 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
380a0 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
380b0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
380c0 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
380d0 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
380e0 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
380f0 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
38100 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
38110 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
38120 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
38130 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
38140 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
38150 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
38160 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
38170 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
38180 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
38190 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
381a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
381b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
381c0 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
381d0 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
381e0 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
381f0 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
38200 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
38210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38220 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
38230 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
38240 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
38250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38260 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
38270 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
38280 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
38290 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
382a0 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
382b0 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
382c0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
382d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
382e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
382f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
38300 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
38310 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
38320 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
38330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38340 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
38350 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
38360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
38380 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
38390 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
383a0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
383b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
383c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
383d0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
383e0 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e  UPT_DB || iPage>
383f0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
38400 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
38410 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
38420 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67  e );..  if( iPag
38430 65 3c 32 20 7c 7c 20 69 50 61 67 65 3e 70 42 74  e<2 || iPage>pBt
38440 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 72  ->nPage ){.    r
38450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
38460 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
38470 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
38480 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
38490 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
384a0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 6