/ Hex Artifact Content
Login

Artifact dc80ac8374105e3caf298a6533e3312101691330:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 2f  ARED_CACHE */../
3a70: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3a80: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 74 6f  ng structure sto
3a90: 72 65 73 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  res the in-memor
3aa0: 79 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 75 73  y pointer map us
3ab0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 0a 2a 2a 20  ed for newly.** 
3ac0: 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20  allocated pages 
3ad0: 69 6e 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61 6e  in UNLOCKED tran
3ae0: 73 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70  sactions. Such p
3af0: 61 67 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ages are always 
3b00: 61 6c 6c 6f 63 61 74 65 64 20 0a 2a 2a 20 69 6e  allocated .** in
3b10: 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c   a contiguous bl
3b20: 6f 63 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e  ock (from the en
3b30: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73  d of the file) s
3b40: 74 61 72 74 69 6e 67 20 77 69 74 68 20 70 61 67  tarting with pag
3b50: 65 0a 2a 2a 20 42 74 72 65 65 50 74 72 6d 61 70  e.** BtreePtrmap
3b60: 2e 69 46 69 72 73 74 2e 0a 2a 2a 20 0a 2a 2a 20  .iFirst..** .** 
3b70: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
3b80: 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 70  for the parent p
3b90: 61 67 65 20 69 46 69 72 73 74 20 69 73 20 73 74  age iFirst is st
3ba0: 6f 72 65 64 20 69 6e 20 61 50 74 72 5b 30 5d 2e  ored in aPtr[0].
3bb0: 20 46 6f 72 0a 2a 2a 20 28 69 46 69 72 73 74 2b   For.** (iFirst+
3bc0: 31 29 2c 20 61 50 74 72 5b 31 5d 2e 20 41 20 7a  1), aPtr[1]. A z
3bd0: 65 72 6f 20 76 61 6c 75 65 20 69 6e 64 69 63 61  ero value indica
3be0: 74 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  tes that the pag
3bf0: 65 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 62 65 65  e has not.** bee
3c00: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  n allocated..**.
3c10: 2a 2a 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73  **.*/..typedef s
3c20: 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e  truct RollbackEn
3c30: 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72  try RollbackEntr
3c40: 79 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  y;.typedef struc
3c50: 74 20 50 74 72 6d 61 70 45 6e 74 72 79 20 50 74  t PtrmapEntry Pt
3c60: 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74 72 75 63  rmapEntry;.struc
3c70: 74 20 50 74 72 6d 61 70 45 6e 74 72 79 20 7b 0a  t PtrmapEntry {.
3c80: 20 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20    Pgno parent;. 
3c90: 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74   u8 eType;.};.st
3ca0: 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74  ruct RollbackEnt
3cb0: 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ry {.  Pgno pgno
3cc0: 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b  ;.  Pgno parent;
3cd0: 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a  .  u8 eType;.};.
3ce0: 0a 73 74 72 75 63 74 20 42 74 72 65 65 50 74 72  .struct BtreePtr
3cf0: 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69 46 69  map {.  Pgno iFi
3d00: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
3d10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3d20: 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72   new page number
3d30: 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20 20 69   aPtr[0] */..  i
3d40: 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20 20 20  nt nPtrAlloc;   
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d60: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
3d70: 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72 61 79   of aPtr[] array
3d80: 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e 74 72   */.  PtrmapEntr
3d90: 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20 20 20  y *aPtr;        
3da0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
3db0: 66 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  f parent page nu
3dc0: 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  mbers */..  int 
3dd0: 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20 20 20  nSvpt;          
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3df0: 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53 76 70  sed size of aSvp
3e00: 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  t[] array */.  i
3e10: 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b 20 20  nt nSvptAlloc;  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e30: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
3e40: 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f 0a 20   of aSvpt[] */. 
3e50: 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20 20 20   int *aSvpt;    
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c 6c 62   /* First aRollb
3e80: 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f 72 20  ack[] entry for 
3e90: 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f 0a 0a  savepoint i */..
3ea0: 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b 3b    int nRollback;
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65 20 6f    /* Used size o
3ed0: 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72  f aRollback[] ar
3ee0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ray */.  int nRo
3ef0: 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20 20 20  llbackAlloc;    
3f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3f10: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52  cated size of aR
3f20: 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20  ollback[] array 
3f30: 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74  */.  RollbackEnt
3f40: 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b 20 20  ry *aRollback;  
3f50: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
3f60: 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72 69 65   rollback entrie
3f70: 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  s */.};..static 
3f80: 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61 70 53  int btreePtrmapS
3f90: 74 6f 72 65 28 0a 20 20 42 74 72 65 65 50 74 72  tore(.  BtreePtr
3fa0: 6d 61 70 20 2a 70 4d 61 70 2c 20 0a 20 20 50 67  map *pMap, .  Pg
3fb0: 6e 6f 20 70 67 6e 6f 2c 20 0a 20 20 75 38 20 65  no pgno, .  u8 e
3fc0: 54 79 70 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61  Type, .  Pgno pa
3fd0: 72 65 6e 74 0a 29 7b 0a 20 20 69 66 28 20 70 67  rent.){.  if( pg
3fe0: 6e 6f 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74  no>=pMap->iFirst
3ff0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e 74   ){.    int iEnt
4000: 72 79 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61 70  ry = pgno - pMap
4010: 2d 3e 69 46 69 72 73 74 3b 0a 0a 20 20 20 20 2f  ->iFirst;..    /
4020: 2a 20 47 72 6f 77 20 74 68 65 20 61 50 74 72 5b  * Grow the aPtr[
4030: 5d 20 61 72 72 61 79 20 69 66 20 72 65 71 75 69  ] array if requi
4040: 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  red */.    if( i
4050: 45 6e 74 72 79 3e 3d 70 4d 61 70 2d 3e 6e 50 74  Entry>=pMap->nPt
4060: 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  rAlloc ){.      
4070: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4080: 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f 20 70 4d 61  >nPtrAlloc ? pMa
4090: 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 2a 32 20 3a  p->nPtrAlloc*2 :
40a0: 20 31 36 3b 0a 20 20 20 20 20 20 50 74 72 6d 61   16;.      Ptrma
40b0: 70 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20 28  pEntry *aNew = (
40c0: 50 74 72 6d 61 70 45 6e 74 72 79 2a 29 73 71 6c  PtrmapEntry*)sql
40d0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
40e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
40f0: 74 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28  tr, nNew*sizeof(
4100: 50 74 72 6d 61 70 45 6e 74 72 79 29 0a 20 20 20  PtrmapEntry).   
4110: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
4120: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
4130: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4140: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
4150: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
4160: 20 6e 42 79 74 65 20 3d 20 28 6e 4e 65 77 2d 70   nByte = (nNew-p
4170: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29 2a  Map->nPtrAlloc)*
4180: 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e 74  sizeof(PtrmapEnt
4190: 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ry);.        mem
41a0: 73 65 74 28 26 61 4e 65 77 5b 70 4d 61 70 2d 3e  set(&aNew[pMap->
41b0: 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20 30 2c 20 6e  nPtrAlloc], 0, n
41c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Byte);.        p
41d0: 4d 61 70 2d 3e 61 50 74 72 20 3d 20 61 4e 65 77  Map->aPtr = aNew
41e0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e  ;.        pMap->
41f0: 6e 50 74 72 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77  nPtrAlloc = nNew
4200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4210: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
4220: 6e 74 72 79 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ntry to the roll
4230: 62 61 63 6b 20 6c 6f 67 20 69 66 20 72 65 71 75  back log if requ
4240: 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ired */.    if( 
4250: 70 4d 61 70 2d 3e 6e 53 76 70 74 3e 30 20 26 26  pMap->nSvpt>0 &&
4260: 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74   pMap->aPtr[iEnt
4270: 72 79 5d 2e 70 61 72 65 6e 74 20 29 7b 0a 20 20  ry].parent ){.  
4280: 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e 52      if( pMap->nR
4290: 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61 70 2d 3e 6e  ollback>=pMap->n
42a0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 29 7b  RollbackAlloc ){
42b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  .        int nNe
42c0: 77 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  w = pMap->nRollb
42d0: 61 63 6b 20 3f 20 70 4d 61 70 2d 3e 6e 52 6f 6c  ack ? pMap->nRol
42e0: 6c 62 61 63 6b 2a 32 20 3a 20 31 36 3b 0a 20 20  lback*2 : 16;.  
42f0: 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45 6e        RollbackEn
4300: 74 72 79 20 2a 61 4e 65 77 20 3d 20 28 52 6f 6c  try *aNew = (Rol
4310: 6c 62 61 63 6b 45 6e 74 72 79 2a 29 73 71 6c 69  lbackEntry*)sqli
4320: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
4330: 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61           pMap->a
4340: 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e 65 77 2a 73  Rollback, nNew*s
4350: 69 7a 65 6f 66 28 52 6f 6c 6c 62 61 63 6b 45 6e  izeof(RollbackEn
4360: 74 72 79 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  try).        );.
4370: 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
4380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
4390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
43a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65  OMEM;.        }e
43b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
43c0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 20 3d  Map->aRollback =
43d0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   aNew;.         
43e0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
43f0: 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20  Alloc = nNew;.  
4400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4410: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
4420: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
4430: 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f 20 3d 20 70  llback].pgno = p
4440: 67 6e 6f 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d  gno;.      pMap-
4450: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d  >aRollback[pMap-
4460: 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 61 72 65  >nRollback].pare
4470: 6e 74 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72 5b  nt = pMap->aPtr[
4480: 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 3b 0a  iEntry].parent;.
4490: 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c        pMap->aRol
44a0: 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c  lback[pMap->nRol
44b0: 6c 62 61 63 6b 5d 2e 65 54 79 70 65 20 3d 20 70  lback].eType = p
44c0: 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79  Map->aPtr[iEntry
44d0: 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 7d 0a 0a  ].eType;.    }..
44e0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
44f0: 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 2a  e aPtr[] array *
4500: 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50 74 72  /.    pMap->aPtr
4510: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20  [iEntry].parent 
4520: 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 70 4d  = parent;.    pM
4530: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
4540: 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a  .eType = eType;.
4550: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
4560: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4570: 2a 20 4f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * Open savepoint
4580: 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 69 66 20   iSavepoint, if 
4590: 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
45a0: 79 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  y open..*/.stati
45b0: 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61  c int btreePtrma
45c0: 70 42 65 67 69 6e 28 42 74 72 65 65 50 74 72 6d  pBegin(BtreePtrm
45d0: 61 70 20 2a 70 4d 61 70 2c 20 69 6e 74 20 6e 53  ap *pMap, int nS
45e0: 76 70 74 29 7b 0a 20 20 69 66 28 20 6e 53 76 70  vpt){.  if( nSvp
45f0: 74 3c 70 4d 61 70 2d 3e 6e 53 76 70 74 20 29 7b  t<pMap->nSvpt ){
4600: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4610: 69 66 28 20 6e 53 76 70 74 3e 3d 70 4d 61 70 2d  if( nSvpt>=pMap-
4620: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 29 7b 0a 20  >nSvptAlloc ){. 
4630: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
4640: 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63  pMap->nSvptAlloc
4650: 20 3f 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c   ? pMap->nSvptAl
4660: 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20  loc*2 : 16;.    
4670: 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 73 71    int *aNew = sq
4680: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d  lite3_realloc(pM
4690: 61 70 2d 3e 61 53 76 70 74 2c 20 73 69 7a 65 6f  ap->aSvpt, sizeo
46a0: 66 28 69 6e 74 29 20 2a 20 6e 4e 65 77 29 3b 0a  f(int) * nNew);.
46b0: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
46c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
46d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
46e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
46f0: 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76         pMap->aSv
4700: 70 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  pt = aNew;.     
4710: 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c     pMap->nSvptAl
4720: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  loc = nNew;.    
4730: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
4740: 6f 72 28 69 3d 70 4d 61 70 2d 3e 6e 53 76 70 74  or(i=pMap->nSvpt
4750: 3b 20 69 3c 6e 53 76 70 74 3b 20 69 2b 2b 29 7b  ; i<nSvpt; i++){
4760: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76  .      pMap->aSv
4770: 70 74 5b 69 5d 20 3d 20 70 4d 61 70 2d 3e 6e 52  pt[i] = pMap->nR
4780: 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  ollback;.    }. 
4790: 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d     pMap->nSvpt =
47a0: 20 6e 53 76 70 74 3b 0a 20 20 7d 0a 0a 20 20 72   nSvpt;.  }..  r
47b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
47c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
47d0: 63 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50  ck (if op==SAVEP
47e0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f  OINT_ROLLBACK) o
47f0: 72 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70  r release (if op
4800: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4810: 41 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ASE).** savepoin
4820: 74 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74  t iSvpt..*/.stat
4830: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72  ic void btreePtr
4840: 6d 61 70 45 6e 64 28 42 74 72 65 65 50 74 72 6d  mapEnd(BtreePtrm
4850: 61 70 20 2a 70 4d 61 70 2c 20 69 6e 74 20 6f 70  ap *pMap, int op
4860: 2c 20 69 6e 74 20 69 53 76 70 74 29 7b 0a 20 20  , int iSvpt){.  
4870: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
4880: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
4890: 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
48a0: 52 45 4c 45 41 53 45 20 29 3b 0a 20 20 61 73 73  RELEASE );.  ass
48b0: 65 72 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c  ert( iSvpt>=0 ||
48c0: 20 28 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f   (iSvpt==-1 && o
48d0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
48e0: 4c 42 41 43 4b 29 20 29 3b 0a 20 20 69 66 28 20  LBACK) );.  if( 
48f0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 70  iSvpt<0 ){.    p
4900: 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b 0a  Map->nSvpt = 0;.
4910: 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62      pMap->nRollb
4920: 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  ack = 0;.    mem
4930: 73 65 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c 20  set(pMap->aPtr, 
4940: 30 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  0, sizeof(Pgno) 
4950: 2a 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f  * pMap->nPtrAllo
4960: 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c);.  }else if( 
4970: 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e 53 76 70  iSvpt<pMap->nSvp
4980: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d  t ){.    if( op=
4990: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
49a0: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ACK ){.      int
49b0: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
49c0: 69 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  i=pMap->nRollbac
49d0: 6b 2d 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61  k-1; ii>=pMap->a
49e0: 53 76 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d  Svpt[iSvpt]; ii-
49f0: 2d 29 7b 0a 20 20 20 20 20 20 20 20 52 6f 6c 6c  -){.        Roll
4a00: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4a10: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4a20: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 50 74 72  ii];.        Ptr
4a30: 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  mapEntry *pEntry
4a40: 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b 70   = &pMap->aPtr[p
4a50: 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69  ->pgno - pMap->i
4a60: 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20 20  First];.        
4a70: 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 20 3d  pEntry->parent =
4a80: 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20   p->parent;.    
4a90: 20 20 20 20 70 45 6e 74 72 79 2d 3e 65 54 79 70      pEntry->eTyp
4aa0: 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20  e = p->eType;.  
4ab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4ac0: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 69 53  pMap->nSvpt = iS
4ad0: 76 70 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50  vpt + (op==SAVEP
4ae0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  OINT_ROLLBACK);.
4af0: 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62      pMap->nRollb
4b00: 61 63 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70  ack = pMap->aSvp
4b10: 74 5b 69 53 76 70 74 5d 3b 0a 20 20 7d 0a 7d 0a  t[iSvpt];.  }.}.
4b20: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
4b30: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
4b40: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
4b50: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4b60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68   */../*.***** Th
4b70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4b80: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
4b90: 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a  ert() only ****.
4ba0: 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  **.** Verify tha
4bb0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
4bc0: 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ds the mutex on 
4bd0: 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  its BtShared.*/.
4be0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4bf0: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
4c00: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c10: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
4c20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
4c30: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
4c40: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
4c50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  if../*.** Invali
4c60: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
4c70: 77 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63  w cache of the c
4c80: 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
4c90: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4ca0: 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  nt..** on the sh
4cb0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
4cc0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65  ture pBt..*/.#de
4cd0: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
4ce0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
4cf0: 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  r) (pCur->curFla
4d00: 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
4d10: 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dOvfl)../*.** In
4d20: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
4d30: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
4d40: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
4d50: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
4d60: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
4d70: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
4d80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4d90: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
4da0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
4db0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
4dc0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
4dd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4de0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4df0: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
4e00: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4e10: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4e20: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
4e30: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
4e40: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
4e50: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
4e60: 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  B./*.** This fun
4e70: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
4e80: 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
4e90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4ea0: 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69   a table.** to i
4eb0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
4ec0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
4ed0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
4ee0: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
4ef0: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
4f00: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  ing modified..**
4f10: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
4f20: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
4f30: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65  true, then the e
4f40: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
4f50: 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69  f the.** table i
4f60: 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65  s about to be de
4f70: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4f80: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ase invalidate a
4f90: 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63  ll incrblob.** c
4fa0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61  ursors open on a
4fb0: 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68  ny row within th
4fc0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
4fd0: 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e  t-page pgnoRoot.
4fe0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
4ff0: 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73  , if argument is
5000: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61  ClearTable is fa
5010: 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  lse, then the ro
5020: 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20  w with.** rowid 
5030: 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65  iRow is being re
5040: 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65  placed or delete
5050: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
5060: 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e  invalidate.** on
5070: 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f  ly those incrblo
5080: 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
5090: 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20  n that specific 
50a0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  row..*/.static v
50b0: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  oid invalidateIn
50c0: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20  crblobCursors(. 
50d0: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
50f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
5100: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20   check */.  i64 
5110: 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20  iRow,           
5120: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
5130: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
5140: 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  hanging */.  int
5150: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20   isClearTable   
5160: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5170: 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69  all rows are bei
5180: 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b  ng deleted */.){
5190: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
51a0: 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61    if( pBtree->ha
51b0: 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20  sIncrblobCur==0 
51c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
51d0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
51e0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65  HoldsMutex(pBtre
51f0: 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e  e) );.  pBtree->
5200: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
5210: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72   0;.  for(p=pBtr
5220: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
5230: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
5240: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75  {.    if( (p->cu
5250: 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e  rFlags & BTCF_In
5260: 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20  crblob)!=0 ){.  
5270: 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49      pBtree->hasI
5280: 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a  ncrblobCur = 1;.
5290: 20 20 20 20 20 20 69 66 28 20 69 73 43 6c 65 61        if( isClea
52a0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
52b0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a  o.nKey==iRow ){.
52c0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
52d0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
52e0: 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
52f0: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
5300: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
5310: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
5320: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
5330: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
5340: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
5350: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  s(x,y,z).#endif 
5360: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
5370: 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
5380: 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f  * Set bit pgno o
5390: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  f the BtShared.p
53a0: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
53b0: 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  c. This is calle
53c0: 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67  d .** when a pag
53d0: 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c  e that previousl
53e0: 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61  y contained data
53f0: 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
5400: 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61  list leaf .** pa
5410: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74  ge..**.** The Bt
5420: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5430: 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73  nt bitvec exists
5440: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
5450: 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75  an obscure.** bu
5460: 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20  g caused by the 
5470: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74  interaction of t
5480: 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74  wo useful IO opt
5490: 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f  imizations surro
54a0: 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c  unding.** free-l
54b0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a  ist leaf pages:.
54c0: 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
54d0: 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  all data is dele
54e0: 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20  ted from a page 
54f0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63  and the page bec
5500: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66  omes.**      a f
5510: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
5520: 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20  ge, the page is 
5530: 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
5540: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
5550: 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73      (as free-lis
5560: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e  t leaf pages con
5570: 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66  tain no meaningf
5580: 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69  ul data). Someti
5590: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68  mes.**      such
55a0: 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65   a page is not e
55b0: 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28  ven journalled (
55c0: 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
55d0: 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20  e modified,.**  
55e0: 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a      why bother j
55f0: 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e  ournalling it?).
5600: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
5610: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
5620: 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64  f page is reused
5630: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73  , its content is
5640: 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20   not read.**    
5650: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62    from the datab
5660: 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74  ase or written t
5670: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
5680: 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69  le (why should i
5690: 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66  t.**      be, if
56a0: 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c   it is not at al
56b0: 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a  l meaningful?)..
56c0: 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c  **.** By themsel
56d0: 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d  ves, these optim
56e0: 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69  izations work fi
56f0: 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61  ne and provide a
5700: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
5710: 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62  mance boost to b
5720: 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e  ulk delete or in
5730: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  sert operations.
5740: 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20   However, if.** 
5750: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
5760: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
5770: 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64   and then reused
5780: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
5790: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  .** transaction,
57a0: 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73   a problem comes
57b0: 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65   up. If the page
57c0: 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c   is not journall
57d0: 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73  ed when.** it is
57e0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
57f0: 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69  ee-list and it i
5800: 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e  s also not journ
5810: 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a  alled when it.**
5820: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
5830: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
5840: 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65   and reused, the
5850: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  n the original d
5860: 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f  ata.** may be lo
5870: 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74  st. In the event
5880: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20   of a rollback, 
5890: 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  it may not be po
58a0: 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73  ssible.** to res
58b0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
58c0: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
58d0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l configuration.
58e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74  .**.** The solut
58f0: 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61  ion is the BtSha
5900: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
5910: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
5920: 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d   a page is .** m
5930: 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  oved to become a
5940: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
5950: 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73  page, the corres
5960: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a  ponding bit is.*
5970: 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74  * set in the bit
5980: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
5990: 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74  leaf page is ext
59a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
59b0: 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70  free-list,.** op
59c0: 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f  timization 2 abo
59d0: 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  ve is omitted if
59e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
59f0: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
5a00: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
5a10: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
5a20: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
5a30: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
5a40: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
5a50: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
5a60: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
5a70: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5a80: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
5a90: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5aa0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
5ab0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5ac0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
5ad0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  ontent ){.    as
5ae0: 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d  sert( pgno<=pBt-
5af0: 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42  >nPage );.    pB
5b00: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
5b10: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
5b20: 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29  eate(pBt->nPage)
5b30: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
5b40: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
5b50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5b60: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5b70: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
5b80: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
5b90: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
5ba0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5bb0: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
5bc0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
5bd0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
5be0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
5bf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5c00: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
5c10: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
5c20: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
5c30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5c40: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
5c50: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
5c60: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
5c70: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
5c80: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
5c90: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
5ca0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
5cb0: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
5cc0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
5cd0: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
5ce0: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
5cf0: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
5d00: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
5d10: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
5d20: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
5d30: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5d40: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
5d50: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
5d60: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
5d70: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
5d80: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
5d90: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
5da0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
5db0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5dc0: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
5dd0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
5de0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
5df0: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
5e00: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
5e10: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
5e20: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
5e30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
5e40: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
5e50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
5e60: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
5e70: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
5e80: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
5e90: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
5ea0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
5eb0: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  * Release all of
5ec0: 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61   the apPage[] pa
5ed0: 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ges for a cursor
5ee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5ef0: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5f00: 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75  CursorPages(BtCu
5f10: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
5f20: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5f30: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
5f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
5f50: 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
5f60: 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75  age[i]);.    pCu
5f70: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  r->apPage[i] = 0
5f80: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50  ;.  }.  pCur->iP
5f90: 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  age = -1;.}.../*
5fa0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
5fb0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5fc0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5fd0: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5fe0: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5ff0: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
6000: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
6010: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
6020: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
6030: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
6040: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
6050: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
6060: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
6070: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
6080: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
6090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
60a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
60b0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
60c0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
60d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
60e0: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
60f0: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
6100: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
6110: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
6120: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
6130: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
6140: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6150: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
6160: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
6170: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6180: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
6190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
61a0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
61b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
61c0: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
61d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
61e0: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
61f0: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
6200: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
6210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f  =SQLITE_OK );  /
6220: 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e  * KeySize() cann
6230: 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a  ot fail */..  /*
6240: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
6250: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
6260: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
6270: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
6280: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
6290: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
62a0: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
62b0: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
62c0: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
62d0: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
62e0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
62f0: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
6300: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
6310: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
6320: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
6330: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
6340: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
6350: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
6360: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  ta..  */.  if( 0
6370: 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
6380: 79 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  y ){.    void *p
6390: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
63a0: 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20  loc( pCur->nKey 
63b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
63c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
63d0: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
63e0: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
63f0: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
6400: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6410: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6420: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
6430: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
6440: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6450: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
6460: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6470: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6480: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6490: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
64a0: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
64b0: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
64c0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
64d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
64e0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
64f0: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
6500: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6510: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
6520: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
6530: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
6540: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
6550: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
6560: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
6570: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53   */.static int S
6580: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6590: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
65a0: 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c  (BtCursor*,Pgno,
65b0: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a  BtCursor*);../*.
65c0: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
65d0: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
65e0: 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78  sors (except pEx
65f0: 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f  cept) that are o
6600: 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61  pen on.** the ta
6610: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
6620: 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69  ge iRoot.  "Savi
6630: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ng the cursor po
6640: 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68  sition" means th
6650: 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69  at.** the locati
6660: 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20  on in the btree 
6670: 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e  is remembered in
6680: 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
6690: 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f   it can be.** mo
66a0: 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ved back to the 
66b0: 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20  same spot after 
66c0: 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65  the btree has be
66d0: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68  en modified.  Th
66e0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
66f0: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
6700: 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65  ore cursor pExce
6710: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
6720: 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c  dify the.** tabl
6730: 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69  e, for example i
6740: 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  n BtreeDelete() 
6750: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
6760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
6770: 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
6780: 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
6790: 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
67a0: 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75   all such .** cu
67b0: 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76  rsors should hav
67c0: 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c  e their BTCF_Mul
67d0: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
67e0: 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72   The btreeCursor
67f0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e  ().** routine en
6800: 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65  forces that rule
6810: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
6820: 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65  only needs to be
6830: 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68   called in.** th
6840: 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  e uncommon case 
6850: 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73  when pExpect has
6860: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
6870: 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  le flag set..**.
6880: 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e  ** If pExpect!=N
6890: 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74  ULL and if no ot
68a0: 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20  her cursors are 
68b0: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d  found on the sam
68c0: 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20  e root-page,.** 
68d0: 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75  then the BTCF_Mu
68e0: 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70  ltiple flag on p
68f0: 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65  Expect is cleare
6900: 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74  d, to avoid anot
6910: 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73  her.** pointless
6920: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
6930: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  utine..**.** Imp
6940: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
6950: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
6960: 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f  merely checks to
6970: 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73   see if any curs
6980: 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62  ors.** need to b
6990: 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c  e saved.  It cal
69a0: 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75  ls out to saveCu
69b0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e  rsorsOnList() in
69c0: 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a   the (unusual).*
69d0: 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72  * event that cur
69e0: 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64  sors are in need
69f0: 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e   to being saved.
6a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6a10: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
6a20: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
6a30: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
6a40: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
6a50: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
6a60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6a70: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6a80: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
6a90: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
6aa0: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
6ab0: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
6ac0: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
6ad0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
6ae0: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6af0: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6b00: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6b10: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
6b20: 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20   if( p ) return 
6b30: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
6b40: 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63  t(p, iRoot, pExc
6b50: 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63  ept);.  if( pExc
6b60: 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63  ept ) pExcept->c
6b70: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
6b80: 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74  _Multiple;.  ret
6b90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6ba0: 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72  ../* This helper
6bb0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65   routine to save
6bc0: 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20  AllCursors does 
6bd0: 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  the actual work 
6be0: 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65  of saving.** the
6bf0: 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20   cursors if and 
6c00: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  when a cursor is
6c10: 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75   found that actu
6c20: 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61  ally requires sa
6c30: 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d  ving..** The com
6c40: 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74  mon case is that
6c50: 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64   no cursors need
6c60: 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f   to be saved, so
6c70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6c80: 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66  .** broken out f
6c90: 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74  rom its caller t
6ca0: 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
6cb0: 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  ary stack pointe
6cc0: 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  r movement..*/.s
6cd0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6ce0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6cf0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42  rsorsOnList(.  B
6d00: 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  tCursor *p,     
6d10: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
6d20: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65   cursor that nee
6d30: 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50  ds saving */.  P
6d40: 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  gno iRoot,      
6d50: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
6d60: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
6d70: 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c  s iRoot. Save al
6d80: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
6d90: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
6da0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61      /* Do not sa
6db0: 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  ve this cursor *
6dc0: 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  /.){.  do{.    i
6dd0: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6de0: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6df0: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6e00: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
6e10: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6e20: 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
6e30: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
6e40: 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
6e50: 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72  int rc = saveCur
6e60: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
6e70: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
6e80: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
6e90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
6ea0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6ec0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50   testcase( p->iP
6ed0: 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  age>0 );.       
6ee0: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6ef0: 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a  CursorPages(p);.
6f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f10: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
6f20: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
6f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6f40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
6f50: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
6f60: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
6f70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6f80: 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42  reeClearCursor(B
6f90: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6fa0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6fb0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6fc0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
6fd0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6fe0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6ff0: 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
7000: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
7010: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  D;.}../*.** In t
7020: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
7030: 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
7040: 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
7050: 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
7060: 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
7070: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
7080: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
7090: 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
70a0: 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
70b0: 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
70c0: 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
70d0: 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74  he work..*/.stat
70e0: 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65  ic int btreeMove
70f0: 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
7100: 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
7110: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
7120: 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
7130: 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
7140: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
7150: 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
7160: 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
7170: 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
7180: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
7190: 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
71a0: 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
71b0: 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
71c0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
71d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
71e0: 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
71f0: 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
7200: 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
7210: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
7220: 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
7230: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
7260: 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
7270: 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
7280: 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
7290: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
72a0: 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20  ar aSpace[200]; 
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
72c0: 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
72d0: 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
72e0: 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72  malloc */.  char
72f0: 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
7300: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
7310: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
7320: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
7330: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
7340: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
7350: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
7360: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
7370: 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69  Info, aSpace, si
7380: 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70  zeof(aSpace), &p
7390: 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Free.    );.    
73a0: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
73b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
73c0: 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  OMEM;.    sqlite
73d0: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
73e0: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
73f0: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
7400: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
7410: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
7420: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
7430: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
7440: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
7450: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
7460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7470: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7480: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
7490: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
74a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
74b0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
74c0: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
74d0: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
74e0: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
74f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
7500: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
7510: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
7520: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7530: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
7540: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
7550: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
7560: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
7570: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
7580: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
7590: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
75a0: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
75b0: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
75c0: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
75d0: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
75e0: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
75f0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
7600: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
7610: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
7620: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
7630: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
7640: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
7650: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
7660: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7680: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
7690: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
76a0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
76b0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
76c0: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
76d0: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
76e0: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
76f0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
7700: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
7710: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
7720: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7730: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
7740: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
7750: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
7760: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7770: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
7780: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
7790: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
77a0: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
77b0: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
77c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
77e0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
77f0: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
7800: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
7810: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
7820: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
7830: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
7840: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
7850: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
7860: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
7870: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
7880: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
7890: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
78a0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
78b0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
78c0: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
78d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
78e0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
78f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7900: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
7910: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
7920: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
7930: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
7940: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7950: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
7960: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
7970: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
7980: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
7990: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
79a0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
79b0: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
79c0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
79d0: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
79e0: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
79f0: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
7a00: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
7a10: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
7a20: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
7a30: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
7a40: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
7a50: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
7a60: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
7a70: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
7a80: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
7a90: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
7aa0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
7ab0: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
7ac0: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
7ad0: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
7ae0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
7af0: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
7b00: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
7b10: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
7b20: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
7b30: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
7b40: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
7b50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7b60: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
7b70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
7b80: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
7b90: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
7ba0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
7bb0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7bc0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  D;.}../*.** This
7bd0: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
7be0: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
7bf0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
7c00: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
7c10: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
7c20: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
7c30: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
7c40: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
7c50: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
7c60: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
7c70: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
7c80: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
7c90: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
7ca0: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
7cb0: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
7cc0: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
7cd0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
7ce0: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
7cf0: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
7d00: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
7d10: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
7d20: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
7d30: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
7d40: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
7d50: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
7d60: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
7d70: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
7d80: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
7d90: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
7da0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
7db0: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
7dc0: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
7dd0: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
7de0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
7df0: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
7e00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7e10: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
7e20: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
7e30: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
7e40: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
7e50: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
7e60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7e70: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7e80: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
7e90: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7ea0: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
7eb0: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
7ec0: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7ed0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7ee0: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
7ef0: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7f00: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
7f10: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
7f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
7f30: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
7f40: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
7f50: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
7f60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7f70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
7f80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7f90: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
7fa0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
7fb0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
7fc0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
7fd0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
7fe0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
7ff0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
8000: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
8010: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
8020: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
8030: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
8040: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
8050: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
8060: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
8070: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
8080: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
8090: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
80a0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
80b0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
80c0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
80d0: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
80e0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
80f0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
8100: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
8110: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
8120: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
8130: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
8140: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
8150: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8160: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
8170: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
8180: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
8190: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
81a0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
81b0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
81c0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
81d0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
81e0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
81f0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
8200: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
8210: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
8220: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
8230: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
8240: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
8250: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
8260: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
8270: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
8280: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
8290: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
82a0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
82b0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
82c0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
82d0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
82e0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
82f0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
8300: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
8310: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
8320: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
8330: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
8340: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
8350: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
8360: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
8370: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
8380: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
8390: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
83a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
83b0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
83c0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
83d0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
83e0: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
83f0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
8400: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
8410: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
8420: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
8430: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
8440: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
8450: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
8460: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
8480: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
8490: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
84a0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
84b0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
84c0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
84d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
84e0: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
84f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
8500: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8510: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8520: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
8530: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 42 74  turn;..  if( pBt
8540: 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70  ->pMap ){.    *p
8550: 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  RC = btreePtrmap
8560: 53 74 6f 72 65 28 70 42 74 2d 3e 70 4d 61 70 2c  Store(pBt->pMap,
8570: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8580: 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
8590: 20 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72     /* The master
85a0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
85b0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
85c0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 74 72  be used as a ptr
85d0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20   map page */.   
85e0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
85f0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
8600: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
8610: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 61  (pBt)) );..    a
8620: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
8630: 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 69 66  Vacuum );.    if
8640: 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  ( key==0 ){.    
8650: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
8660: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8670: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8680: 7d 0a 20 20 20 20 69 50 74 72 6d 61 70 20 3d 20  }.    iPtrmap = 
8690: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
86a0: 74 2c 20 6b 65 79 29 3b 0a 20 20 20 20 72 63 20  t, key);.    rc 
86b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
86c0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
86d0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
86e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
86f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8700: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
8710: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8720: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 50 54  .    offset = PT
8730: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
8740: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
8750: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
8760: 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 53  {.      *pRC = S
8770: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8780: 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
8790: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
87a0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
87b0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
87c0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 20 3d  .      pPtrmap =
87d0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
87e0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
87f0: 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ge);..      if( 
8800: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
8810: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
8820: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
8830: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
8840: 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  {.        TRACE(
8850: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
8860: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
8870: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8880: 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 2a  ent));.        *
8890: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
88a0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
88b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
88c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
88d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 74  ){.          pPt
88e0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
88f0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
8900: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
8910: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
8920: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ent);.        }.
8930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8940: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8950: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
8970: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
8980: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
8990: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
89a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
89b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
89c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
89d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
89e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
89f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
8a00: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
8a10: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
8a20: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
8a30: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
8a40: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
8a50: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
8a60: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
8a70: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
8a80: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
8a90: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
8aa0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
8ab0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
8ac0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
8ad0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
8ae0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
8af0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
8b00: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8b10: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
8b20: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8b30: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8b40: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
8b50: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
8b60: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
8b70: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
8b80: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
8b90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8ba0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8bb0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
8bc0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
8bd0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
8be0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
8bf0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
8c00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
8c10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
8c20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8c30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8c40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
8c50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8c60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8c70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8c80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8c90: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
8ca0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8cb0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8cc0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8cd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8ce0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8cf0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8d00: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8d10: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8d20: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8d30: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8d40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
8d50: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
8d60: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8d70: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8d80: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8d90: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8da0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8db0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8dc0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8dd0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8df0: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8e00: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
8e10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
8e20: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
8e30: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
8e40: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
8e50: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
8e60: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
8e70: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
8e80: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
8e90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
8ea0: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8eb0: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8ec0: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8ed0: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8ee0: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8ef0: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8f00: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
8f10: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
8f20: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
8f30: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
8f40: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
8f50: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
8f60: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
8f70: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
8f80: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
8f90: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
8fa0: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8fb0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8fc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8fd0: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8fe0: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8ff0: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
9000: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
9010: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
9020: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
9030: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
9040: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
9050: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
9060: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
9070: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
9080: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
9090: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
90a0: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
90b0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
90c0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
90d0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
90e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
90f0: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
9100: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
9110: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
9120: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
9130: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
9140: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
9150: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
9160: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
9170: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
9180: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
9190: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
91a0: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
91b0: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
91c0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
91d0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
91e0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
91f0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
9200: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
9210: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9220: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9230: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9240: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9260: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9270: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
9280: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9290: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
92a0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
92b0: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
92c0: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
92d0: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
92e0: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
92f0: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
9300: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
9310: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
9320: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
9330: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
9340: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
9350: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
9360: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
9370: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
9380: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
9390: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
93a0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
93b0: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
93c0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
93d0: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
93e0: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
93f0: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
9400: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
9410: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
9420: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
9430: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
9440: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
9450: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
9460: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
9470: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
9480: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
9490: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
94a0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
94b0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
94c0: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
94d0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
94e0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
94f0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
9500: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
9510: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
9520: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
9530: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
9540: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
9550: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
9560: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
9570: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
9580: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
9590: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
95a0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
95b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
95c0: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
95d0: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
95e0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
95f0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9600: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
9610: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
9620: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
9630: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
9640: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
9650: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
9660: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
9670: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
9680: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
9690: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
96a0: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
96b0: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
96c0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  ;.  pInfo->nSize
96d0: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
96e0: 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a  low + 4;.}../*.*
96f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9700: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
9710: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
9720: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72  the MemPage.xPar
9730: 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68  seCell().** meth
9740: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20  od..**.** Parse 
9750: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
9760: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
9770: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
9780: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62  ructure..**.** b
9790: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
97a0: 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  ()        =>   t
97b0: 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20  able btree leaf 
97c0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
97d0: 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64  rseCellNoPayload
97e0: 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62  ()  =>   table b
97f0: 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  tree internal no
9800: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
9810: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
9820: 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72    =>   index btr
9830: 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54  ee nodes.**.** T
9840: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77  here is also a w
9850: 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
9860: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
9870: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
9880: 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74  ** all MemPage t
9890: 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65  ypes and that re
98a0: 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c  ferences the cel
98b0: 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65  l by index rathe
98c0: 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69  r than.** by poi
98d0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
98e0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
98f0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  ellPtrNoPayload(
9900: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9910: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9920: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
9930: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
9940: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9950: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9960: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9970: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9980: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9990: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
99a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
99b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
99c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
99d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
99e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
99f0: 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61  ->leaf==0 );.  a
9a00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f  ssert( pPage->no
9a10: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73  Payload );.  ass
9a20: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9a30: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
9a40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
9a50: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
9a60: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
9a70: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
9a80: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
9a90: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
9aa0: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
9ab0: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
9ac0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
9ad0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
9ae0: 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66  .  pInfo->iOverf
9af0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  low = 0;.  pInfo
9b00: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
9b10: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
9b20: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9b30: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
9b40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9b50: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9b60: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9b70: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9ba0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9bb0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9bc0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9bd0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9be0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9bf0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9c00: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9c10: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
9c20: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
9c30: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
9c40: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9c50: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
9c60: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c80: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
9c90: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
9ca0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9cb0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9cc0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9cd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9ce0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
9cf0: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
9d00: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
9d10: 4c 65 61 66 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  Leaf || pPage->n
9d20: 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73  oPayload );.  as
9d30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50  sert( pPage->noP
9d40: 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 61  ayload==0 );.  a
9d50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9d60: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9d70: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9d80: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9d90: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9da0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9db0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9dc0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9dd0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9de0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9df0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9e00: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9e10: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9e20: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9e30: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9e40: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9e50: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9e60: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9e70: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9e80: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9e90: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9ea0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9eb0: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9ec0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9ed0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9ee0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9ef0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9f00: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9f10: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9f20: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9f30: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9f40: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9f50: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9f60: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9f70: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9f80: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9f90: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9fa0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9fb0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9fc0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9fd0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9fe0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ff0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
a000: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
a010: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
a020: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
a030: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a040: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
a050: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
a060: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
a070: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
a090: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
a0a0: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
a0b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a0c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
a0d0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
a0e0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
a0f0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
a100: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
a110: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a120: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a130: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a140: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a150: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a160: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a170: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a180: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a190: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a1a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a1b0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a1c0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a1d0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a1e0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a1f0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a200: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a210: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a220: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a230: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a240: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a250: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a260: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a270: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a280: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a290: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a2a0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
a2b0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
a2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
a2d0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
a2e0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
a2f0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
a300: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
a310: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
a320: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a  seCellPtrIndex(.
a330: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
a340: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
a350: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
a360: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
a370: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
a380: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
a390: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
a3a0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a3b0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a3c0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a3d0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
a3e0: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
a3f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
a400: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
a410: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
a420: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
a430: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
a440: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
a450: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
a460: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a470: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a480: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a490: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
a4a0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
a4b0: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eaf==1 );.  asse
a4c0: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
a4d0: 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73  yLeaf==0 );.  as
a4e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50  sert( pPage->noP
a4f0: 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 70  ayload==0 );.  p
a500: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a510: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a520: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
a530: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a540: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
a550: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
a560: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
a570: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
a580: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
a590: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
a5a0: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
a5b0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a5c0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a5d0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a5e0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a5f0: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
a600: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
a610: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
a620: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
a630: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
a640: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
a650: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
a660: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a670: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
a680: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
a690: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a6a0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
a6b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a6c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
a6d0: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
a6e0: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
a6f0: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
a700: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
a710: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
a720: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
a730: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
a740: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
a750: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
a760: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a770: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
a780: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
a790: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
a7a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
a7b0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
a7c0: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
a7d0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
a7e0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
a7f0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
a800: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
a810: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
a820: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
a830: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
a840: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
a850: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a860: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a870: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a880: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
a890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a8a0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
a8b0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
a8c0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
a8d0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
a8e0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
a8f0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ure */.){.  pPag
a900: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a910: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
a920: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
a930: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  fo);.}../*.** Th
a940: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a950: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
a960: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
a970: 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a  MemPage.xCellSiz
a980: 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  e.** method..**.
a990: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
a9a0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
a9b0: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
a9c0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
a9d0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
a9e0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
a9f0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
aa00: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
aa10: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
aa20: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
aa30: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
aa40: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
aa50: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
aa60: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
aa70: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
aa80: 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  ..**.** cellSize
aa90: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  PtrNoPayload()  
aaa0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74    =>   table int
aab0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63  ernal nodes.** c
aac0: 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20  ellSizePtr()    
aad0: 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c           =>   al
aae0: 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20  l index nodes & 
aaf0: 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73  table leaf nodes
ab00: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
ab10: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
ab20: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
ab30: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
ab40: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61  er = pCell + pPa
ab50: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
ab60: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
ab70: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
ab80: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
ab90: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
abc0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  or a varint */. 
abd0: 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20   u32 nSize;     
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ac00: 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  e value to retur
ac10: 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  n */..#ifdef SQL
ac20: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
ac30: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
ac40: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
ac50: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
ac60: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
ac70: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
ac80: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
ac90: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
aca0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
acb0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
acc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
acd0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
ace0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
acf0: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
ad00: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
ad10: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
ad20: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
ad30: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
ad40: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
ad50: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
ad60: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
ad70: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
ad80: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
ad90: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
ada0: 61 64 3d 3d 30 20 29 3b 0a 20 20 6e 53 69 7a 65  ad==0 );.  nSize
adb0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
adc0: 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a   nSize>=0x80 ){.
add0: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
ade0: 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20  r[8];.    nSize 
adf0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
ae00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  .      nSize = (
ae10: 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b  nSize<<7) | (*++
ae20: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
ae30: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
ae40: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
ae50: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
ae60: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20   pIter++;.  if( 
ae70: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
ae80: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
ae90: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
aea0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
aeb0: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
aec0: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
aed0: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
aee0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
aef0: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
af00: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
af10: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
af20: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
af30: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
af40: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
af50: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
af60: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
af70: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
af80: 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
af90: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
afa0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
afb0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
afc0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
afd0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
afe0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
aff0: 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b  l ){.    nSize +
b000: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
b010: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
b020: 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20  nSize<4 ) nSize 
b030: 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 4;.  }else{.  
b040: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
b050: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
b060: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
b070: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
b080: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
b090: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b0a0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
b0b0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
b0c0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
b0d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b0e0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
b0f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
b100: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
b110: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
b120: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
b130: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
b140: 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75   nSize += 4 + (u
b150: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
b160: 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  l);.  }.  assert
b170: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
b180: 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52  fo.nSize || CORR
b190: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b1a0: 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d  rn (u16)nSize;.}
b1b0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
b1c0: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
b1d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b1e0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
b1f0: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
b200: 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f   + 4; /* For loo
b210: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
b220: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
b230: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
b240: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
b250: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
b260: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b270: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
b280: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b290: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
b2a0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
b2b0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
b2c0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
b2d0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
b2e0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
b2f0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
b300: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
b310: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
b320: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
b330: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
b340: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
b350: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
b360: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
b370: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
b380: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
b390: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
b3a0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
b3b0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
b3c0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73  debuginfo);.#els
b3d0: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
b3e0: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
b3f0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
b400: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
b410: 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20  ze==4 );.  pEnd 
b420: 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77  = pIter + 9;.  w
b430: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
b440: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
b450: 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  End );.  assert(
b460: 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65   debuginfo.nSize
b470: 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  ==(u16)(pIter - 
b480: 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
b490: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
b4a0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
b4b0: 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65  Cell);.}...#ifde
b4c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
b4d0: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
b4e0: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
b4f0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
b500: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
b510: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
b520: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
b530: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
b540: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
b550: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  l){.  return pPa
b560: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b570: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
b580: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
b590: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b5a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b5b0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
b5c0: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
b5d0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
b5e0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
b5f0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
b600: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
b610: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
b620: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
b630: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
b640: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
b650: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
b660: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
b670: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
b680: 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43  *pCell, int *pRC
b690: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
b6a0: 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29  fo;.  if( *pRC )
b6b0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b6c0: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
b6d0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b6e0: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b6f0: 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
b700: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
b710: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
b720: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
b730: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
b740: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
b750: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
b760: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
b770: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
b780: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
b790: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
b7a0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
b7b0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
b7c0: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
b7d0: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
b7e0: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
b7f0: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
b800: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
b810: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
b820: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
b830: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
b840: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
b850: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
b860: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b870: 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44  area..**.** EVID
b880: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32  ENCE-OF: R-44582
b890: 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61  -60138 SQLite ma
b8a0: 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74  y from time to t
b8b0: 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61  ime reorganize a
b8c0: 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20  .** b-tree page 
b8d0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
b8e0: 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20  e no freeblocks 
b8f0: 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65  or fragment byte
b900: 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64  s, all.** unused
b910: 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61   bytes are conta
b920: 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c  ined in the unal
b930: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65  located space re
b940: 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a  gion, and all.**
b950: 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65   cells are packe
b960: 64 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65  d tightly at the
b970: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b990: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
b9a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b9b0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b9e0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba00: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
ba10: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
ba20: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
ba30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
ba40: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
ba50: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
ba60: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
ba70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ba80: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
ba90: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
baa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bab0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
bac0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
bad0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
baf0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
bb00: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
bb10: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
bb40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
bb50: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
bb60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
bb70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bb80: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
bb90: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
bba0: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
bbb0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
bbc0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
bbd0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
bbe0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
bbf0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
bc00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
bc10: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
bc20: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
bc30: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
bc40: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
bc50: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
bc60: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
bc70: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
bc80: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
bc90: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
bca0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
bcb0: 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73  */...  assert( s
bcc0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bcd0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bce0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bcf0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bd00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bd10: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bd20: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bd30: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bd40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd50: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bd80: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bd90: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bda0: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bdb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
bdc0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
bdd0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
bde0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
bdf0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
be00: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
be10: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
be20: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
be30: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
be40: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
be50: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
be60: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  ze;.  cbrk = usa
be70: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
be80: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
be90: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
bea0: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
beb0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
bec0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
bed0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
bee0: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
bef0: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
bf00: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
bf10: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
bf20: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
bf30: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
bf40: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
bf50: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
bf60: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
bf70: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
bf80: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  );.    /* These 
bf90: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
bfa0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
bfb0: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
bfc0: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
bfd0: 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73  if PRAGMA cell_s
bfe0: 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20  ize_check=ON..  
bff0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
c000: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c010: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c020: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c030: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c040: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
c050: 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc>=iCellFirst
c060: 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73   && pc<=iCellLas
c070: 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  t );.    size = 
c080: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
c090: 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d  (pPage, &src[pc]
c0a0: 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73  );.    cbrk -= s
c0b0: 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72  ize;.    if( cbr
c0c0: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  k<iCellFirst || 
c0d0: 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69  pc+size>usableSi
c0e0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
c0f0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c100: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
c110: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
c120: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
c130: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
c140: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
c150: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
c160: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c170: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
c180: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c190: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
c1a0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
c1b0: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
c1c0: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
c1d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
c1e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c1f0: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
c200: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
c210: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
c220: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
c230: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c240: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
c250: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
c260: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
c270: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
c280: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
c290: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
c2a0: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
c2b0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
c2c0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
c2d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
c2e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
c2f0: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
c300: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
c310: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
c320: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
c330: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c340: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c350: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c360: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c370: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c380: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c390: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
c3a0: 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ( cbrk-iCellFirs
c3b0: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
c3c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c3e0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
c3f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c400: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66  .** Search the f
c410: 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65  ree-list on page
c420: 20 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74   pPg for space t
c430: 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e  o store a cell n
c440: 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a  Byte bytes in.**
c450: 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61   size. If one ca
c460: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
c470: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
c480: 74 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65  the space and re
c490: 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20  move it.** from 
c4a0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
c4b0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  *.** If no suita
c4c0: 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65  ble space can be
c4d0: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72   found on the fr
c4e0: 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20  ee-list, return 
c4f0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
c500: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65   function may de
c510: 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20  tect corruption 
c520: 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20  within pPg.  If 
c530: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a  corruption is.**
c540: 20 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a   detected then *
c550: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51  pRc is set to SQ
c560: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
c570: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
c580: 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f  d..**.** Slots o
c590: 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  n the free list 
c5a0: 74 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e  that are between
c5b0: 20 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c   1 and 3 bytes l
c5c0: 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65  arger than nByte
c5d0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  .** will be igno
c5e0: 72 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68  red if adding th
c5f0: 65 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f  e extra space to
c600: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69   the fragmentati
c610: 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73  on count.** caus
c620: 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  es the fragmenta
c630: 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78  tion count to ex
c640: 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74  ceed 60..*/.stat
c650: 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53  ic u8 *pageFindS
c660: 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67  lot(MemPage *pPg
c670: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
c680: 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20   *pRc){.  const 
c690: 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
c6a0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  drOffset;.  u8 *
c6b0: 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
c6c0: 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74  Pg->aData;.  int
c6d0: 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31   iAddr = hdr + 1
c6e0: 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74  ;.  int pc = get
c6f0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64  2byte(&aData[iAd
c700: 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20  dr]);.  int x;. 
c710: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
c720: 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
c730: 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  leSize;..  asser
c740: 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b  t( pc>0 );.  do{
c750: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
c760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c770: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
c780: 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49  ot */.    /* EVI
c790: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36  DENCE-OF: R-0686
c7a0: 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63  6-39125 Freebloc
c7b0: 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f  ks are always co
c7c0: 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72  nnected in order
c7d0: 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65   of.    ** incre
c7e0: 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f  asing offset. */
c7f0: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
c800: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69  leSize-4 || pc<i
c810: 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  Addr+4 ){.      
c820: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
c830: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c840: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c850: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
c860: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
c870: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
c880: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
c890: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
c8a0: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
c8b0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
c8c0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
c8d0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
c8e0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
c8f0: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
c900: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
c910: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
c920: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
c930: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
c940: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
c950: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
c960: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
c970: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c980: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
c990: 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65  if( pc < pPg->ce
c9a0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e  llOffset+2*pPg->
c9b0: 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63  nCell || size+pc
c9c0: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
c9d0: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
c9e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c9f0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  KPT;.        ret
ca00: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
ca10: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
ca20: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
ca30: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
ca40: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
ca50: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
ca60: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
ca70: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
ca80: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
ca90: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
caa0: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
cab0: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
cac0: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
cad0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
cae0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
caf0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
cb00: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
cb10: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
cb20: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
cb30: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
cb40: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
cb50: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
cb60: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
cb70: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
cb80: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
cb90: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )x;.      }else{
cba0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cbb0: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
cbc0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
cbd0: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
cbe0: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
cbf0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
cc00: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
cc10: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
cc20: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
cc30: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
cc40: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
cc50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
cc60: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
cc70: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
cc80: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
cc90: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
cca0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29  ;.  }while( pc )
ccb0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ;..  return 0;.}
ccc0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
ccd0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
cce0: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
ccf0: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
cd00: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
cd10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
cd20: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
cd30: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
cd40: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
cd50: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
cd60: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
cd70: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
cd80: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
cd90: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
cda0: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
cdb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
cdc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
cdd0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
cde0: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
cdf0: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
ce00: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
ce10: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
ce20: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
ce30: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
ce40: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
ce50: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
ce60: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
ce70: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
ce80: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
ce90: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
cea0: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
ceb0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
cec0: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
ced0: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
cee0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
cef0: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
cf00: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
cf10: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
cf20: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
cf30: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
cf40: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
cf50: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
cf60: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
cf70: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
cf80: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
cf90: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
cfa0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
cfb0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
cfc0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
cfd0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
cfe0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
cff0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d000: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d010: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d020: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d050: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d060: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d070: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d080: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d0a0: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
d0b0: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
d0c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d0d0: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
d0e0: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
d0f0: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
d100: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
d110: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
d120: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
d130: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d140: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
d150: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d160: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d170: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d180: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d190: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
d1a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
d1b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
d1c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
d1d0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
d1e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d1f0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d200: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
d210: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
d220: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
d230: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
d240: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d250: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
d260: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
d270: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
d280: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
d290: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
d2a0: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
d2b0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
d2c0: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
d2d0: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
d2e0: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
d2f0: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
d300: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
d310: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
d320: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
d330: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
d340: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
d350: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d360: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
d370: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
d380: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
d390: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
d3a0: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
d3b0: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
d3c0: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
d3d0: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
d3e0: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
d3f0: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
d400: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
d410: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
d420: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d430: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
d440: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
d450: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
d460: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
d470: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
d480: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
d490: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
d4a0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d4b0: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
d4c0: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
d4d0: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
d4e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d4f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d510: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e  * If there is en
d520: 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65  ough space betwe
d530: 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66  en gap and top f
d540: 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c  or one more cell
d550: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72   pointer.  ** ar
d560: 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74  ray entry offset
d570: 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65  , and if the fre
d580: 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70  elist is not emp
d590: 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20  ty, then search 
d5a0: 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73  the.  ** freelis
d5b0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
d5c0: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
d5d0: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
d5e0: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a  the request..  *
d5f0: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
d600: 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+2==top );.  te
d610: 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74  stcase( gap+1==t
d620: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
d630: 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20  ( gap==top );.  
d640: 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d  if( (data[hdr+2]
d650: 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29   || data[hdr+1])
d660: 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29   && gap+2<=top )
d670: 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65  {.    u8 *pSpace
d680: 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
d690: 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72  pPage, nByte, &r
d6a0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61  c);.    if( pSpa
d6b0: 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ce ){.      asse
d6c0: 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61  rt( pSpace>=data
d6d0: 20 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61   && (pSpace - da
d6e0: 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
d6f0: 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29     *pIdx = (int)
d700: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b  (pSpace - data);
d710: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d720: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
d730: 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  se if( rc ){.   
d740: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d750: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d760: 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20  e request could 
d770: 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64  not be fulfilled
d780: 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73   using a freelis
d790: 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20  t slot.  Check. 
d7a0: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65   ** to see if de
d7b0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73  fragmentation is
d7c0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
d7d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d7e0: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
d7f0: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
d800: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73  te>top ){.    as
d810: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
d820: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
d830: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
d840: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
d850: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
d860: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d870: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
d880: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
d890: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
d8a0: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
d8b0: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
d8c0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
d8d0: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
d8e0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
d8f0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
d900: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
d910: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
d920: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
d930: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
d940: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
d950: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
d960: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
d970: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
d980: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
d990: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
d9a0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
d9b0: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
d9c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
d9d0: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
d9e0: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
d9f0: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
da00: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
da10: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
da20: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
da30: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
da40: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
da50: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
da60: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
da70: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
da80: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
da90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
daa0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
dab0: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
dac0: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
dad0: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
dae0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
daf0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
db00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
db10: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
db20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
db30: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
db40: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
db50: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
db60: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
db70: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
db80: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
db90: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
dba0: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
dbb0: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
dbc0: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
dbd0: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
dbe0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
dbf0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
dc00: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
dc10: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
dc20: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
dc30: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
dc40: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
dc50: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
dc60: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
dc70: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
dc80: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
dc90: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
dca0: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
dcb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dcc0: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
dcd0: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
dce0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
dcf0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
dd00: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
dd10: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
dd20: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
dd50: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
dd60: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
dd70: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dda0: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
ddb0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dde0: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
ddf0: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
de00: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
de30: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
de40: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
de50: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
de60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
de70: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
de80: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
de90: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
dea0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
deb0: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
dec0: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
ded0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
dee0: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
def0: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
df00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
df10: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
df20: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
df30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
df40: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
df50: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
df60: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
df70: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
df80: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
df90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
dfa0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
dfb0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
dfc0: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
dfd0: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
dfe0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
dff0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e000: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
e010: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
e020: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
e030: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
e040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
e060: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
e070: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
e080: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
e090: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
e0a0: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
e0b0: 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20  ( iStart<=iLast 
e0c0: 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  );..  /* Overwri
e0d0: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
e0e0: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
e0f0: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
e100: 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70  e_delete.  ** op
e110: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
e120: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
e130: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
e140: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
e150: 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
e160: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30  &data[iStart], 0
e170: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , iSize);.  }.. 
e180: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
e190: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
e1a0: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
e1b0: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
e1c0: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
e1d0: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
e1e0: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
e1f0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
e200: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
e210: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
e220: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
e230: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
e240: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
e250: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
e260: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
e270: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
e280: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
e290: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
e2a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
e2b0: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
e2c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e2d0: 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42  r]))>0 && iFreeB
e2e0: 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  lk<iStart ){.   
e2f0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
e300: 69 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20  iPtr+4 ) return 
e310: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
e320: 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20  KPT;.      iPtr 
e330: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
e340: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
e350: 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72  lk>iLast ) retur
e360: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e370: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
e380: 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72  t( iFreeBlk>iPtr
e390: 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20   || iFreeBlk==0 
e3a0: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20  );.  .    /* At 
e3b0: 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20  this point:.    
e3c0: 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20  **    iFreeBlk: 
e3d0: 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63    First freebloc
e3e0: 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20  k after iStart, 
e3f0: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a  or zero if none.
e400: 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20      **    iPtr: 
e410: 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73        The addres
e420: 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74  s of a pointer t
e430: 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  o iFreeBlk.    *
e440: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
e450: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
e460: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
e470: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
e480: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
e490: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
e4a0: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
e4b0: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
e4c0: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
e4d0: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
e4e0: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
e4f0: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
e500: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e510: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69  ;.      iEnd = i
e520: 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79  FreeBlk + get2by
e530: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
e540: 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  k+2]);.      if(
e550: 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70   iEnd > pPage->p
e560: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
e570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e580: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e590: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
e5a0: 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  - iStart;.      
e5b0: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
e5c0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
e5d0: 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  lk]);.    }.  . 
e5e0: 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73     /* If iPtr is
e5f0: 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f   another freeblo
e600: 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20  ck (that is, if 
e610: 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20  iPtr is not the 
e620: 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20  freelist.    ** 
e630: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70  pointer in the p
e640: 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e  age header) then
e650: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
e660: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
e670: 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63  e.    ** coalesc
e680: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
e690: 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a  of iPtr..    */.
e6a0: 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64 72      if( iPtr>hdr
e6b0: 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  +1 ){.      int 
e6c0: 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b  iPtrEnd = iPtr +
e6d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e6e0: 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20  iPtr+2]);.      
e6f0: 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69  if( iPtrEnd+3>=i
e700: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
e710: 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74   if( iPtrEnd>iSt
e720: 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  art ) return SQL
e730: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e740: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
e750: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
e760: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
e770: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
e780: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
e790: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
e7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
e7b0: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
e7c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e7d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e7e0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d     data[hdr+7] -
e7f0: 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69  = nFrag;.  }.  i
e800: 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62  f( iStart==get2b
e810: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
e820: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
e830: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73  new freeblock is
e840: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
e850: 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  g of the cell co
e860: 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20  ntent area,.    
e870: 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e  ** so just exten
e880: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
e890: 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74  nt area rather t
e8a0: 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68  han create anoth
e8b0: 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69  er.    ** freeli
e8c0: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  st entry */.    
e8d0: 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20  if( iPtr!=hdr+1 
e8e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e8f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
e900: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e910: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
e920: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
e930: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
e940: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
e950: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
e960: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
e970: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
e980: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
e990: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
e9a0: 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62  tart);.    put2b
e9b0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
e9c0: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
e9d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e9e0: 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a  [iStart+2], iSiz
e9f0: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
ea00: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
ea10: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
ea20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ea30: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
ea40: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
ea50: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
ea60: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
ea70: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
ea80: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
ea90: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
eaa0: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
eab0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
eac0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
ead0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
eae0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
eaf0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
eb00: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
eb10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
eb20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
eb30: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
eb40: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
eb50: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
eb60: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
eb70: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
eb80: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
eb90: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eba0: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
ebb0: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
ebc0: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
ebd0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ebe0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
ebf0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
ec00: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
ec10: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
ec20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
ec30: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
ec40: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
ec50: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
ec60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ec70: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
ec80: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
ec90: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
eca0: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
ecb0: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
ecc0: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
ecd0: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
ece0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
ecf0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
ed00: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
ed10: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
ed20: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
ed30: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
ed40: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
ed50: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
ed60: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
ed70: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
ed80: 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33  E-OF: R-03640-13
ed90: 34 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35  415 A value of 5
eda0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
edb0: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
edc0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72     ** table b-tr
edd0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
ede0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
edf0: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
ee00: 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==5 );.    /* E
ee10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30  VIDENCE-OF: R-20
ee20: 35 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75  501-61796 A valu
ee30: 65 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68  e of 13 means th
ee40: 65 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66  e page is a leaf
ee50: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d  .    ** table b-
ee60: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
ee70: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
ee80: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
ee90: 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33  EY|PTF_LEAF)==13
eea0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
eeb0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69  ntKey = 1;.    i
eec0: 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
eed0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
eee0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20  ntKeyLeaf = 1;. 
eef0: 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61       pPage->noPa
ef00: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 20  yload = 0;.     
ef10: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
ef20: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
ef30: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
ef40: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
ef50: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
ef60: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50        pPage->noP
ef70: 61 79 6c 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20  ayload = 1;.    
ef80: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
ef90: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
efa0: 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20  NoPayload;.     
efb0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
efc0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
efd0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  ellPtrNoPayload;
efe0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
eff0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
f000: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
f010: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
f020: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
f030: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
f040: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
f050: 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  A ){.    /* EVID
f060: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35  ENCE-OF: R-27225
f070: 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f  -53936 A value o
f080: 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61  f 2 means the pa
f090: 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f  ge is an interio
f0a0: 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62  r.    ** index b
f0b0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f0c0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f0d0: 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a  ZERODATA)==2 );.
f0e0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f0f0: 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31  OF: R-16571-1161
f100: 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20  5 A value of 10 
f110: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f120: 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20  s a leaf.    ** 
f130: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
f140: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f150: 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c  ( (PTF_ZERODATA|
f160: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b  PTF_LEAF)==10 );
f170: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
f180: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
f190: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
f1a0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  0;.    pPage->no
f1b0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
f1c0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f1d0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f1e0: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
f1f0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f200: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
f210: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
f220: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
f230: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
f240: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f250: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
f260: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
f270: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
f280: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
f290: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
f2a0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f2b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
f2c0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
f2d0: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
f2e0: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
f2f0: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
f300: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f310: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
f320: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
f330: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
f340: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
f350: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f360: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
f370: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
f380: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
f390: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
f3a0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
f3b0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
f3c0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
f3d0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
f3e0: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
f3f0: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
f400: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
f410: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
f420: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
f430: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
f440: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
f450: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
f460: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
f470: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
f480: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f490: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
f4a0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
f4b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f4c0: 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
f4d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f4e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f4f0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
f510: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
f520: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
f530: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
f540: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f550: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
f560: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
f570: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
f580: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f590: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
f5a0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
f5b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
f5c0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
f5d0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
f5e0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
f5f0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
f600: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
f610: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
f620: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
f630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f640: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
f650: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
f660: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
f670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
f680: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
f690: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
f6a0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
f6b0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
f6c0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
f6d0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
f6e0: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
f6f0: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
f700: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
f710: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
f720: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
f730: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
f740: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
f750: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
f760: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
f770: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f780: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
f790: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
f7a0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
f7b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
f7c0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
f7d0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
f7e0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
f7f0: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
f800: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
f810: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
f820: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
f830: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
f840: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
f850: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
f860: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
f870: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
f880: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
f890: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
f8a0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
f8b0: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ata;.    /* EVID
f8c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
f8d0: 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
f8e0: 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
f8f0: 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
f900: 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
f910: 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
f920: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
f930: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
f940: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
f950: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f960: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
f970: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
f980: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
f990: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
f9a0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
f9b0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
f9c0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
f9d0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
f9e0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
f9f0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
fa00: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
fa10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
fa20: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
fa30: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
fa40: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
fa50: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
fa60: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
fa70: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
fa80: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
fa90: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
faa0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
fab0: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
fac0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
fad0: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
fae0: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
faf0: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
fb00: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
fb10: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
fb20: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
fb30: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
fb40: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
fb50: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
fb60: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
fb70: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
fb80: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
fb90: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
fba0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
fbb0: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
fbc0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
fbd0: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
fbe0: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
fbf0: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
fc00: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
fc10: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
fc20: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
fc30: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
fc40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
fc50: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
fc60: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
fc70: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
fc80: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
fc90: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
fca0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
fcb0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
fcc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
fcd0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
fce0: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
fcf0: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
fd00: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
fd10: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
fd20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
fd30: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
fd40: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
fd50: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
fd60: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
fd70: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
fd80: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
fd90: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
fda0: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
fdb0: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
fdc0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
fdd0: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
fde0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
fdf0: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
fe00: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
fe10: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
fe20: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
fe30: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
fe40: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
fe50: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
fe60: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
fe70: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
fe80: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
fe90: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
fea0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
feb0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
fec0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
fed0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
fee0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
fef0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
ff00: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
ff10: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
ff20: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
ff30: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
ff40: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
ff50: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
ff60: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
ff70: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
ff80: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
ff90: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
ffa0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
ffb0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
ffc0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
ffd0: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
ffe0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
fff0: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
10000 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
10010 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
10020 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
10030 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
10040 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
10050 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
10060 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
10070 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
10080 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
10090 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
100a0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
100b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
100c0 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
100d0 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
100e0 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
100f0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10100 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
10110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10120 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
10130 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
10140 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
10150 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
10160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10170 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10180 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
10190 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65        sz = pPage
101a0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
101b0 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
101c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
101d0 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
101e0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
101f0 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
10200 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
10210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10220 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10230 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10240 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
10250 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
10260 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20  ++;.    }  ..   
10270 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10280 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
10290 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
102a0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
102b0 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
102c0 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
102d0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
102e0 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
102f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
10300 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
10310 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
10320 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
10330 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
10340 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
10350 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
10360 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
10370 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
10380 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
10390 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
103a0 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
103b0 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68   space */.    wh
103c0 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
103d0 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
103e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
103f0 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
10400 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
10410 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
10420 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
10430 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
10440 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
10450 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
10460 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
10470 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
10480 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
10490 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
104a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
104b0 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72     ** Or, the fr
104c0 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  eeblock is off t
104d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
104e0 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ge.        */.  
104f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10500 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10510 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
10520 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
10530 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
10540 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
10550 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
10560 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74  .      if( (next
10570 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
10580 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a  ize+3) || pc+siz
10590 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
105a0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
105b0 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
105c0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
105d0 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20  r. And the last 
105e0 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20  byte of.        
105f0 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  ** the free-bloc
10600 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68  k must lie on th
10610 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  e database page.
10620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
10630 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10640 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
10650 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
10660 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
10670 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
10680 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
10690 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
106a0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
106b0 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
106c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
106d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
106e0 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
106f0 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
10700 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
10710 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
10720 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
10730 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
10740 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
10750 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
10760 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10770 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10780 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10790 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
107a0 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
107b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
107c0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
107d0 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
107e0 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
107f0 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
10800 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
10810 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
10820 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
10830 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
10840 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10860 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
10870 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
10880 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
10890 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
108a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
108b0 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
108c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
108d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
108e0 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
108f0 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
10900 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
10910 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
10920 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
10930 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
10940 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
10950 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
10960 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
10970 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
10980 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
10990 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
109a0 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
109b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
109c0 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
109d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
109e0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
109f0 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
10a00 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
10a10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
10a20 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
10a30 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
10a40 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
10a50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10a60 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
10a70 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
10a80 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
10a90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
10aa0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
10ab0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10ac0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10ad0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10ae0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
10af0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
10b00 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
10b10 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10b20 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10b30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10b40 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10b50 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10b60 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10b70 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
10b80 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
10b90 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
10ba0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
10bb0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
10bc0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
10bd0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10be0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
10bf0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
10c00 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
10c10 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
10c20 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
10c30 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
10c40 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
10c50 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
10c60 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10c70 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
10c80 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
10c90 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
10ca0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
10cb0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
10cc0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
10cd0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
10ce0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
10cf0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
10d00 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
10d10 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
10d20 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
10d30 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
10d40 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
10d50 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
10d60 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
10d70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
10d80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
10d90 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
10da0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
10db0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
10dc0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
10dd0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
10de0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10df0 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
10e00 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
10e10 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
10e20 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
10e30 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10e40 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
10e50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10e60 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
10e70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
10e80 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
10e90 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
10ea0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
10eb0 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
10ec0 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
10ed0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
10ee0 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
10ef0 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31  Offset = pgno==1
10f00 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
10f10 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
10f20 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
10f30 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
10f40 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
10f50 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
10f60 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
10f70 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10f80 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
10f90 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
10fa0 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
10fb0 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
10fc0 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
10fd0 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
10fe0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
10ff0 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
11000 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
11010 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
11020 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
11030 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
11040 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
11050 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
11060 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
11070 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
11080 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
11090 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
110a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
110b0 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
110c0 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
110d0 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
110e0 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
110f0 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
11100 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
11110 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
11120 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
11130 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
11140 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
11150 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
11160 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
11170 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
11180 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11190 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
111a0 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
111b0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
111c0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
111d0 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
111e0 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
111f0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
11200 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
11210 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
11220 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
11230 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
11240 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
11250 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
11260 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
11270 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
11280 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
11290 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
112a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
112b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
112c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
112d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
112e0 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
112f0 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
11300 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
11310 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
11320 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
11330 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
11340 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
11350 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
11360 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11370 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
11380 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
11390 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
113a0 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
113b0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
113c0 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
113d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
113e0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
113f0 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
11400 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
11410 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
11420 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
11430 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
11440 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
11450 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
11460 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
11470 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
11480 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11490 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
114a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
114b0 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
114c0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
114d0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
114e0 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
114f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
11500 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11510 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11520 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
11530 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
11540 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
11550 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11560 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
11570 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
11580 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
11590 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
115a0 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
115b0 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
115c0 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
115d0 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
115e0 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
115f0 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
11600 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
11610 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
11620 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
11630 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
11640 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
11650 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
11660 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11670 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11680 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 23 69 66 64 65  ->pBt);.}..#ifde
11690 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
116a0 55 4e 4c 4f 43 4b 45 44 0a 2f 2a 0a 2a 2a 20 54  UNLOCKED./*.** T
116b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
116c0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 6c  called before al
116d0 6c 6f 63 61 74 69 6e 67 20 6f 72 20 66 72 65 65  locating or free
116e0 69 6e 67 20 61 20 62 2d 74 72 65 65 20 70 61 67  ing a b-tree pag
116f0 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 63 75 72  e. If.** the cur
11700 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
11710 20 69 73 20 55 4e 4c 4f 43 4b 45 44 2c 20 69 74   is UNLOCKED, it
11720 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 42   allocates the B
11730 74 72 65 65 50 74 72 6d 61 70 20 0a 2a 2a 20 73  treePtrmap .** s
11740 74 72 75 63 74 75 72 65 20 61 6e 64 20 7a 65 72  tructure and zer
11750 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
11760 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
11770 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
11780 65 72 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2e  er.** on page 1.
11790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
117a0 6c 6c 6f 63 61 74 65 50 74 72 6d 61 70 28 42 74  llocatePtrmap(Bt
117b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
117c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
117d0 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  OK;.  if( pBt->p
117e0 4d 61 70 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  Map==0 && sqlite
117f0 33 50 61 67 65 72 49 73 55 6e 6c 6f 63 6b 65 64  3PagerIsUnlocked
11800 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
11810 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
11820 69 73 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 74  is an unlocked t
11830 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 65 74 20  ransaction, set 
11840 74 68 65 20 68 65 61 64 65 72 20 76 61 6c 75 65  the header value
11850 73 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 66  s.    ** identif
11860 79 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ying the size of
11870 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
11880 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
11890 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
118a0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
118b0 65 20 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  e to zero. */.  
118c0 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
118d0 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Map = sqlite3_ma
118e0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72 65  lloc(sizeof(Btre
118f0 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 69  ePtrmap));.    i
11900 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20  f( pMap==0 ){.  
11910 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11920 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
11930 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
11940 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
11950 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a 65 6f  ta[32], 0, sizeo
11960 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20 20 20  f(u32)*2);.     
11970 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20 30 2c   memset(pMap, 0,
11980 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74 72   sizeof(BtreePtr
11990 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70 4d 61  map));.      pMa
119a0 70 2d 3e 69 46 69 72 73 74 20 3d 20 62 74 72 65  p->iFirst = btre
119b0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
119c0 2b 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  + 1;.      pBt->
119d0 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20  pMap = pMap;.   
119e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
119f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
11a00 65 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  e a pointer-map 
11a10 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 6c 6c  allocated by all
11a20 6f 63 61 74 65 50 74 72 6d 61 70 2e 0a 2a 2f 0a  ocatePtrmap..*/.
11a30 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 6c 65  static void dele
11a40 74 65 50 74 72 6d 61 70 28 42 74 53 68 61 72 65  tePtrmap(BtShare
11a50 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 72 65 65  d *pBt){.  Btree
11a60 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
11a70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
11a80 70 4d 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  pMap ){.    sqli
11a90 74 65 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61  te3_free(pMap->a
11aa0 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 73  Rollback);.    s
11ab0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70  qlite3_free(pMap
11ac0 2d 3e 61 50 74 72 29 3b 0a 20 20 20 20 73 71 6c  ->aPtr);.    sql
11ad0 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e  ite3_free(pMap->
11ae0 61 53 76 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  aSvpt);.    sqli
11af0 74 65 33 5f 66 72 65 65 28 70 4d 61 70 29 3b 0a  te3_free(pMap);.
11b00 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
11b10 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  0;.  }.}.#else.#
11b20 64 65 66 69 6e 65 20 61 6c 6c 6f 63 61 74 65 50  define allocateP
11b30 74 72 6d 61 70 28 78 29 20 53 51 4c 49 54 45 5f  trmap(x) SQLITE_
11b40 4f 4b 0a 23 64 65 66 69 6e 65 20 64 65 6c 65 74  OK.#define delet
11b50 65 50 74 72 6d 61 70 28 78 29 20 0a 23 65 6e 64  ePtrmap(x) .#end
11b60 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  if../*.** Get a 
11b70 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
11b80 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
11b90 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ze it..**.** If 
11ba0 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65  pCur!=0 then the
11bb0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66   page is being f
11bc0 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f  etched as part o
11bd0 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  f a moveToChild(
11be0 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61  ).** call.  Do a
11bf0 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
11c00 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
11c10 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
11c20 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68  se..** And if th
11c30 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74  e fetch fails, t
11c40 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
11c50 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d   decrement pCur-
11c60 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  >iPage..**.** Th
11c70 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65  e page is fetche
11c80 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20  d as read-write 
11c90 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e  unless pCur is n
11ca0 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a  ot NULL and is.*
11cb0 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  * a read-only cu
11cc0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rsor..**.** If a
11cd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11ce0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
11cf0 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
11d00 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
11d10 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
11d20 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
11d30 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
11d40 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
11d50 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
11d60 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d80 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
11d90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
11da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11db0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11dc0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
11dd0 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
11de0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
11df0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11e00 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
11e10 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43  er here */.  BtC
11e20 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e40 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76  Cursor to receiv
11e50 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e  e the page, or N
11e60 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ULL */.  int bRe
11e70 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
11e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11e90 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
11ea0 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
11eb0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
11ec0 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
11ed0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11ee0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11ef0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
11f00 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65  Cur==0 || ppPage
11f10 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ==&pCur->apPage[
11f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
11f30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11f40 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
11f50 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
11f60 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
11f70 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
11f80 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
11f90 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
11fa0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
11fb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11fc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11fd0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11fe0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11ff0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12000 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
12010 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12020 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
12030 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
12040 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
12050 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12060 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
12070 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
12080 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12090 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
120a0 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
120b0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
120c0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
120d0 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
120e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
120f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12100 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
12110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Page);.      got
12120 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
12130 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
12140 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  }..  /* If obtai
12150 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
12160 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
12170 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
12180 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
12190 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
121a0 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
121b0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
121c0 72 0a 20 20 20 26 26 20 28 28 2a 70 70 50 61 67  r.   && ((*ppPag
121d0 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
121e0 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
121f0 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
12200 79 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  y).  ){.    rc =
12210 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12220 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73  BKPT;.    releas
12230 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12240 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12250 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12260 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12270 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
12280 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
12290 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d  if( pCur ) pCur-
122a0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74  >iPage--;.  test
122b0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
122c0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
122d0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
122e0 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
122f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12300 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
12310 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
12320 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
12330 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
12340 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12350 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
12360 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
12370 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
12380 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
12390 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
123a0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
123b0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
123c0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
123d0 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
123e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
123f0 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
12400 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
12410 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
12420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12430 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
12440 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
12450 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
12460 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12470 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
12480 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12490 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
124a0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
124b0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
124c0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
124d0 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
124e0 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
124f0 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
12500 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
12510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
12520 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
12530 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
12540 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
12550 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
12560 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
12570 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
12580 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
12590 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
125a0 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
125b0 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
125c0 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
125d0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
125e0 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
125f0 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
12600 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
12610 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
12620 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
12630 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
12640 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12650 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
12660 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
12670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12680 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
12690 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
126a0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
126b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
126c0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
126d0 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
126e0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
126f0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12700 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12710 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12720 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12730 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
12740 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
12750 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
12760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12770 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
12780 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
12790 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
127a0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
127b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
127c0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
127d0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
127e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
127f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12800 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12810 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12820 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12830 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
12840 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
12850 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
12860 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
12870 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
12880 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
12890 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
128a0 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
128b0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
128c0 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
128d0 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
128e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
128f0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12900 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12910 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12920 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12930 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12940 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12950 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12960 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12970 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12980 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
12990 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
129a0 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
129b0 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
129c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
129d0 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
129e0 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
129f0 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12a00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12a10 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12a20 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12a30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12a40 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12a50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12a60 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12a70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12a80 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12a90 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12aa0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12ab0 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
12ac0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
12ad0 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
12ae0 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12af0 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12b00 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12b10 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12b20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12b30 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12b40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12b50 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12b60 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12b70 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12b80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12b90 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
12ba0 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
12bb0 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
12bc0 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
12bd0 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
12be0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12bf0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12c00 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12c10 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12c20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12c30 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12c40 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12c50 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12c60 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12c70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12c80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
12c90 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12ca0 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
12cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12cc0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
12cd0 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
12ce0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12cf0 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12d00 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12d10 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12d20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12d30 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12d40 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12d50 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12d60 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12d70 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12d80 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
12d90 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
12da0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
12db0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
12dc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12dd0 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
12de0 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
12df0 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
12e00 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12e10 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
12e20 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
12e30 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
12e40 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
12e50 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
12e60 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
12e70 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
12e80 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
12e90 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
12ea0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
12eb0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
12ec0 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
12ed0 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
12ee0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
12ef0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
12f00 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
12f10 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12f20 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
12f30 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
12f40 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
12f50 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
12f60 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
12f70 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
12f80 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
12f90 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
12fa0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
12fb0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
12fc0 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
12fd0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
12fe0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
12ff0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
13000 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
13010 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
13020 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
13030 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
13040 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
13050 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
13060 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
13070 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
13080 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
13090 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
130a0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
130b0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
130c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
130d0 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
130e0 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
130f0 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
13100 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
13110 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
13120 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13130 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
13140 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
13150 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
13160 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
13170 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
13180 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
13190 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
131a0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
131b0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
131c0 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
131d0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
131e0 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
131f0 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
13200 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
13210 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
13220 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
13230 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
13240 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
13250 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
13260 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
13270 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
13280 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
13290 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
132a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
132b0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
132c0 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
132d0 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
132e0 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
132f0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
13310 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
13320 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13330 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
13340 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
13350 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
13360 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
13370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13380 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
13390 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
133a0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
133b0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
133c0 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
133d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
133e0 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
133f0 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
13400 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
13410 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
13420 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
13430 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
13440 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
13450 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
13460 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
13470 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
13480 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
13490 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
134a0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
134b0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
134c0 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
134d0 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
134e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
134f0 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
13500 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
13510 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
13520 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13530 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
13540 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
13550 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
13560 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
13570 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
13580 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
13590 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
135a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
135b0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
135c0 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
135d0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
135e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
135f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
13600 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13610 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
13620 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
13630 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
13640 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
13650 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13660 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
13670 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
13680 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
13690 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
136a0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
136b0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
136c0 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
136d0 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
136e0 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
136f0 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
13700 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
13710 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
13720 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13730 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
13740 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
13750 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
13760 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
13770 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
13780 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
13790 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
137a0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
137b0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
137c0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
137d0 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
137e0 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
137f0 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13800 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
13810 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
13820 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
13830 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
13840 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
13850 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
13860 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
13870 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
13880 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
13890 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
138a0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
138b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
138c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
138d0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
138e0 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
138f0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
13900 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13910 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
13920 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
13930 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
13940 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
13950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13960 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
13970 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13980 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
13990 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
139a0 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
139b0 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
139c0 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
139d0 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
139e0 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
139f0 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
13a00 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
13a10 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
13a20 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
13a30 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
13a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
13a50 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
13a60 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
13a70 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13a80 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
13a90 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
13aa0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
13ab0 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
13ac0 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
13ad0 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
13ae0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
13af0 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
13b00 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
13b10 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
13b20 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
13b30 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13b40 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
13b50 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
13b60 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
13b70 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
13b80 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
13b90 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
13ba0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13bb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13bd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
13be0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
13bf0 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
13c00 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
13c10 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
13c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13c40 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
13c50 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
13c90 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
13ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13cc0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
13cd0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13cf0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
13d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13d10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
13d20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
13d30 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
13d40 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
13d50 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
13d60 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
13d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13d80 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
13d90 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
13da0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
13db0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13dc0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13dd0 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
13de0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13df0 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
13e00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
13e10 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
13e20 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
13e30 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
13e40 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
13e50 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
13e60 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
13e70 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
13e80 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
13e90 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
13ea0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
13eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
13ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ed0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
13ee0 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
13ef0 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
13f00 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
13f10 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
13f20 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
13f30 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
13f40 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
13f50 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
13f60 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
13f70 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
13f80 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
13f90 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13fb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13fc0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13fe0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13ff0 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
14000 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14010 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14020 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14040 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
14050 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14060 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
14070 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14090 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
140a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
140b0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
140c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
140d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
140e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
140f0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
14100 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
14110 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14120 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
14130 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14140 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14150 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
14160 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
14170 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
14180 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
14190 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
141a0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
141b0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
141c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
141d0 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
141e0 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
141f0 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
14200 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
14210 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
14220 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
14230 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
14240 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
14250 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
14260 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
14270 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
14280 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
14290 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
142a0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
142b0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
142c0 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
142d0 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
142e0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
142f0 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
14300 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
14310 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
14320 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
14330 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
14340 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
14350 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
14360 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
14370 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
14380 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14390 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
143a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
143b0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
143c0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
143d0 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
143e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
143f0 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
14400 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
14410 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
14420 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
14430 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
14440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14450 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
14460 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14470 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
14480 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
14490 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
144a0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
144b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
144c0 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
144d0 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
144e0 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
144f0 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
14500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14510 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14520 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
14530 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
14540 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
14550 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
14560 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
14570 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
14580 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
14590 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
145a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
145b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
145c0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
145d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
145e0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
145f0 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
14600 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
14610 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
14620 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
14630 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
14640 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
14650 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
14660 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
14670 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
14680 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
14690 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
146a0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
146b0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
146c0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
146d0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
146e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
146f0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
14700 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
14710 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
14720 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
14730 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
14740 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
14750 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
14760 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
14770 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
14780 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
14790 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
147a0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
147b0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
147c0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
147d0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
147e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
147f0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
14800 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
14810 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
14820 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
14830 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
14840 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
14850 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
14860 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
14870 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
14880 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
14890 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
148a0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
148b0 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
148c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
148d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
148e0 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
148f0 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
14900 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
14910 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
14920 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
14930 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
14940 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
14950 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
14960 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
14970 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
14980 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14990 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
149a0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
149b0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
149c0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
149d0 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
149e0 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
149f0 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
14a00 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
14a10 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
14a20 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
14a30 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
14a40 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
14a50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
14a60 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
14a70 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
14a80 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14a90 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
14aa0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
14ab0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
14ac0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
14ad0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14ae0 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
14af0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
14b00 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
14b10 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
14b20 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
14b30 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
14b40 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
14b50 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
14b60 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
14b70 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
14b80 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
14b90 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14ba0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
14bb0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
14bc0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
14bd0 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
14be0 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
14bf0 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
14c00 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
14c10 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14c20 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14c30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14c50 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
14c60 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14c70 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14c80 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
14c90 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14ca0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14cb0 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
14cc0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
14cd0 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
14ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14cf0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
14d00 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
14d10 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
14d20 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
14d30 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14d40 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
14d50 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
14d60 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
14d70 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
14d80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
14d90 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
14da0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
14db0 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
14dc0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
14dd0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
14de0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
14df0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14e00 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
14e10 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
14e20 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
14e30 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
14e40 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
14e50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14e60 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
14e70 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
14e80 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
14e90 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
14ea0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
14eb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
14ec0 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14ed0 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14ee0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14ef0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14f00 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14f10 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
14f20 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
14f30 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
14f40 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
14f50 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
14f60 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14f70 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
14f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14f90 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
14fa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14fc0 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
14fd0 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
14fe0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
14ff0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
15000 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15010 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15020 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
15030 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
15040 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
15050 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15060 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
15070 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
15080 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15090 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
150a0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
150b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
150c0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
150d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
150e0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
150f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15100 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
15110 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15120 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
15130 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
15140 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
15150 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
15160 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
15170 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
15180 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
15190 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
151a0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
151b0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
151c0 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
151d0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
151e0 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
151f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
15200 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
15210 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
15220 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
15230 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
15240 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
15250 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
15260 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
15270 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
15280 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
15290 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
152a0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
152b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
152c0 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
152d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
152e0 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
152f0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
15300 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
15310 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
15320 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15330 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15340 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
15350 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
15360 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
15370 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
15380 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
15390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
153a0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
153b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
153c0 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
153d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
153e0 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
153f0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15400 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
15410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15420 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
15430 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
15440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
15460 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
15470 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
15480 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
15490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
154a0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
154b0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
154c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
154d0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
154e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
154f0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
15500 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15510 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
15520 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15530 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
15540 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
15550 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
15560 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
15570 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
15580 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
15590 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
155a0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
155b0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
155c0 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
155d0 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
155e0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
155f0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
15600 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15610 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
15620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
15630 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15640 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
15650 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
15660 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
15670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15680 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
15690 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
156a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
156b0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
156c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
156d0 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
156e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
156f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
15700 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
15710 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
15720 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
15730 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
15740 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
15750 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
15760 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
15770 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
15780 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
15790 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
157a0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
157b0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
157c0 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
157d0 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
157e0 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
157f0 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
15800 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
15810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15820 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
15830 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15840 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
15850 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
15860 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
15870 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
15880 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15890 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
158a0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
158b0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
158c0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
158d0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
158e0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
158f0 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
15900 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
15910 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
15920 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
15930 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
15940 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15950 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15960 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
15970 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
15980 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15990 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
159a0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
159b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
159c0 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
159d0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
159e0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
159f0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
15a00 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
15a10 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
15a20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
15a30 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
15a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15a50 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
15a60 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
15a70 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
15a80 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
15a90 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
15aa0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
15ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15ac0 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
15ad0 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
15ae0 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
15af0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
15b00 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
15b10 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
15b20 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
15b30 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
15b40 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
15b50 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
15b60 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
15b70 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
15b80 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
15b90 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
15ba0 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
15bb0 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
15bc0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
15bd0 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
15be0 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
15bf0 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
15c00 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
15c10 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
15c20 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
15c30 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
15c40 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
15c50 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
15c60 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
15c70 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
15c80 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
15c90 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
15ca0 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
15cb0 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
15cc0 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
15cd0 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
15ce0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
15cf0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
15d00 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
15d10 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
15d20 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
15d30 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
15d40 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
15d50 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
15d60 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
15d70 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
15d80 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
15d90 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
15da0 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
15db0 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
15dc0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
15dd0 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
15de0 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
15df0 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
15e00 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
15e10 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
15e20 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
15e30 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
15e40 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
15e50 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
15e60 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
15e70 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
15e80 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
15e90 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
15ea0 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
15eb0 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
15ec0 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
15ed0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
15ee0 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
15ef0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
15f00 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
15f10 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
15f20 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
15f30 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
15f40 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
15f50 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
15f60 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
15f70 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
15f80 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
15f90 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
15fa0 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
15fb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
15fc0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
15fd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
15fe0 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
15ff0 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
16000 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
16010 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16020 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
16030 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
16040 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
16050 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
16060 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
16070 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
16080 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
16090 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
160a0 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
160b0 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
160c0 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
160d0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
160e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
160f0 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
16100 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
16110 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
16120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16130 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
16140 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
16150 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16160 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
16170 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
16180 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
16190 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
161a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
161b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
161c0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
161d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
161e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
161f0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
16200 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
16210 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
16220 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
16230 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
16240 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
16250 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
16260 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16270 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
16280 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
16290 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
162a0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
162b0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
162c0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
162d0 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
162e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
162f0 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
16300 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
16310 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
16320 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
16330 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
16340 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
16350 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
16360 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16370 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
16380 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
16390 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
163a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
163b0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
163c0 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
163d0 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
163e0 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
163f0 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
16400 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
16410 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
16420 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16430 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
16440 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
16450 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
16460 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
16470 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
16480 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
16490 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
164a0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
164b0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
164c0 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
164d0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
164e0 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
164f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
16500 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
16510 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
16520 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
16530 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16540 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
16550 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16560 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
16570 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
16580 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
16590 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
165a0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
165b0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
165c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
165d0 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
165e0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
165f0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16610 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
16620 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16630 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16640 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
16650 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
16660 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
16670 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
16680 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
16690 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
166a0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
166b0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
166c0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
166d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
166e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
166f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16710 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
16720 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
16730 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
16740 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
16750 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
16760 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
16770 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
16780 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
16790 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
167a0 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
167b0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
167c0 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
167d0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
167e0 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
167f0 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
16800 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
16810 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
16820 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
16830 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
16840 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
16850 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
16860 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
16870 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
16880 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
16890 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
168a0 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
168b0 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
168c0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
168d0 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
168e0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
168f0 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
16900 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
16910 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
16920 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
16930 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
16940 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
16950 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
16960 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
16970 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
16980 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
16990 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
169a0 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
169b0 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
169c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
169d0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
169e0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
169f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16a00 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16a10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16a20 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16a30 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16a40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16a50 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16a60 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
16a70 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16a90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16ab0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
16ac0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
16ad0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
16ae0 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
16af0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
16b00 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
16b10 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
16b20 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
16b30 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
16b40 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
16b50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
16b60 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
16b70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16b80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16b90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16ba0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16bb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16bc0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
16bd0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
16be0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
16bf0 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
16c00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16c20 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
16c30 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
16c40 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
16c50 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
16c60 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
16c70 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
16c80 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
16c90 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
16ca0 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
16cb0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
16cc0 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
16cd0 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
16ce0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
16cf0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
16d00 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
16d10 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
16d20 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
16d30 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
16d40 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
16d50 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
16d60 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
16d70 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
16d80 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
16d90 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
16da0 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
16db0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
16dc0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
16dd0 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
16de0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
16df0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
16e00 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
16e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
16e20 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
16e30 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
16e40 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
16e50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
16e60 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
16e70 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
16e80 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
16e90 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
16ea0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
16eb0 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
16ec0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
16ed0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16ee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16ef0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16f00 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16f10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f20 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16f30 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
16f40 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
16f50 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16f60 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16f80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
16f90 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
16fa0 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
16fb0 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
16fc0 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
16fd0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
16fe0 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
16ff0 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
17000 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
17010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17020 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
17030 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
17040 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17050 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
17060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17070 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
17080 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
17090 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
170a0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
170b0 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
170c0 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
170d0 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
170e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
170f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17100 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
17120 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
17130 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
17140 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
17150 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
17160 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
17170 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
17180 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
17190 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
171a0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
171b0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
171c0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
171d0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
171e0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
171f0 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
17200 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
17210 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
17220 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
17230 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
17240 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
17250 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
17260 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
17270 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
17280 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
17290 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
172a0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
172b0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
172c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
172d0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
172e0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
172f0 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
17300 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
17310 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
17320 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
17330 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
17340 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
17350 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
17360 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
17370 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
17380 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
17390 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
173a0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
173b0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
173c0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
173d0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
173e0 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
173f0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
17400 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
17410 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
17420 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
17430 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
17440 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
17450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17460 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
17470 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
17480 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
17490 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
174a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
174b0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
174c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
174d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
174e0 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
174f0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
17500 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17510 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
17520 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
17530 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
17540 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
17550 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17560 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
17570 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
17580 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17590 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
175a0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
175b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
175c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
175d0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
175e0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
175f0 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
17600 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
17610 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
17620 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
17630 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
17640 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
17650 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
17660 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
17670 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
17680 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
17690 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
176a0 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
176b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
176c0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
176d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
176e0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
176f0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
17700 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
17710 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
17720 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
17730 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17740 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
17750 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
17760 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
17770 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
17780 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
17790 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
177a0 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
177b0 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
177c0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
177d0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
177e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
177f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17800 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17810 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
17820 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
17830 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17840 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
17850 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
17860 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
17870 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
17880 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
17890 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
178a0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
178b0 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
178c0 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
178d0 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
178e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
178f0 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
17900 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
17910 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
17920 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
17930 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
17940 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
17950 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
17960 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
17970 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
17980 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
17990 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
179a0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
179b0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
179c0 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
179d0 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
179e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
179f0 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
17a00 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
17a10 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
17a20 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
17a30 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
17a40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
17a50 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
17a60 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
17a70 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
17a80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17a90 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
17aa0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
17ab0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17ac0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17ad0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
17ae0 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
17af0 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
17b00 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
17b10 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
17b20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17b30 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17b40 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17b50 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
17b60 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
17b70 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
17b80 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
17b90 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
17ba0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
17bb0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
17bc0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
17bd0 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
17be0 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
17bf0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17c00 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
17c10 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
17c20 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
17c30 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
17c40 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
17c50 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
17c60 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
17c70 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
17c80 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
17c90 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
17ca0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17cb0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
17cc0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
17cd0 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
17ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17cf0 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
17d00 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17d10 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
17d20 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17d30 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
17d40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17d50 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17d60 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17d70 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17d80 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
17d90 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
17da0 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
17db0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
17dc0 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
17dd0 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
17de0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
17df0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
17e00 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
17e10 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
17e20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17e30 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
17e40 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17e50 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17e60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17e70 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17e80 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
17e90 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
17ea0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
17eb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17ec0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17ed0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
17ee0 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
17ef0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
17f00 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
17f10 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
17f20 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
17f30 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
17f40 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
17f50 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
17f60 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17f70 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
17f80 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
17f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17fa0 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
17fb0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
17fc0 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
17fd0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17fe0 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
17ff0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18000 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
18010 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
18020 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
18030 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
18040 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
18050 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
18060 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
18070 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
18080 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
18090 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
180a0 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
180b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
180c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
180d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
180e0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
180f0 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
18100 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
18110 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
18120 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
18130 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
18140 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
18150 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
18160 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
18170 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
18180 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
18190 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
181a0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
181b0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
181c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
181d0 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
181e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
181f0 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
18200 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
18210 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
18220 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
18230 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
18240 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
18250 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
18260 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18270 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
18280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
18290 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
182a0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
182b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
182c0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
182d0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
182e0 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
182f0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
18300 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
18310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
18320 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
18330 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18340 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
18350 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
18360 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
18370 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
18380 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18390 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
183a0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
183b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
183c0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
183d0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
183e0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
183f0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
18400 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18410 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
18420 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
18430 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
18440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
18450 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18460 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
18470 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
18480 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
18490 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
184a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
184b0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
184c0 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
184d0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
184e0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
184f0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
18500 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
18510 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
18520 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
18530 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18540 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18550 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
18560 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
18570 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
18580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18590 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
185a0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
185b0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
185c0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
185d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
185e0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
185f0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
18600 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
18610 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
18620 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
18630 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
18640 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
18650 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
18660 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
18670 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
18680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
18690 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
186a0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
186b0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
186c0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
186d0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
186e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
186f0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
18700 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
18710 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
18720 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
18730 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
18740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
18750 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
18760 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18770 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18780 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
18790 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
187a0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
187b0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
187c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
187d0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
187e0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
187f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18800 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
18810 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
18820 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18830 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18840 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18850 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
18860 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
18870 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
18880 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
18890 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
188a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
188b0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
188c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
188d0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
188e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
188f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
18900 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
18910 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
18920 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
18930 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
18940 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
18950 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
18960 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
18970 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
18980 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
18990 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
189a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
189b0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
189c0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
189d0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
189e0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
189f0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
18a00 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
18a10 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
18a20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
18a30 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
18a40 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
18a50 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
18a60 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
18a70 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
18a80 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
18a90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18aa0 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
18ab0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
18ac0 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
18ad0 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
18ae0 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
18af0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
18b00 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
18b10 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
18b20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
18b30 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
18b40 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
18b50 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
18b60 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
18b70 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
18b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18b90 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18ba0 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
18bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
18bc0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
18bd0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
18be0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
18bf0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
18c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
18c10 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
18c20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18c30 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18c40 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
18c50 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
18c60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
18c70 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
18c80 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
18c90 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
18ca0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18cb0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18cc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
18cd0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
18ce0 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
18cf0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
18d00 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
18d10 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
18d20 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
18d30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
18d40 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
18d50 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
18d60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
18d70 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
18d80 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
18d90 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
18da0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
18db0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
18dc0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
18dd0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
18de0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
18df0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
18e00 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
18e10 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
18e20 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
18e30 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
18e40 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
18e50 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
18e60 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
18e70 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
18e80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18e90 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
18ea0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18eb0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
18ec0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
18ed0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
18ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18ef0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
18f00 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
18f10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18f30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18f40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
18f50 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
18f60 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
18f70 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
18f80 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
18f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
18fb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
18fc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18fd0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18fe0 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18ff0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
19000 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
19010 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
19020 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
19030 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
19040 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
19050 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
19060 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
19070 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
19080 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
19090 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
190a0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
190b0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
190c0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
190d0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
190e0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
190f0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
19100 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
19110 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
19120 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19130 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19140 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19150 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
19160 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
19170 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
19180 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
19190 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
191a0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
191b0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
191c0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
191d0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
191e0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
191f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19200 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
19210 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
19220 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
19230 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19240 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19250 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
19260 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
19270 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
19280 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
19290 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
192a0 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
192b0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
192c0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
192d0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
192e0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
192f0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
19300 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
19310 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19320 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19330 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19340 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19350 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19360 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19370 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
19380 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
19390 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
193a0 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
193b0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
193c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
193d0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
193e0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
193f0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
19400 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
19410 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
19420 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19430 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19440 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19450 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19460 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19470 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
19480 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
19490 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
194a0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
194b0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
194c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
194d0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
194e0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
194f0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
19500 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
19510 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
19520 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19530 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19540 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19560 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19570 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
19580 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
19590 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
195a0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
195b0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
195c0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
195d0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
195e0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
195f0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
19600 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
19610 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19620 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
19630 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19640 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19650 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
19660 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
19670 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19680 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19690 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
196a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
196b0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
196c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
196d0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
196e0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
196f0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
19700 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
19710 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
19720 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
19730 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
19760 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
19770 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
19790 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
197a0 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
197b0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
197c0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
197d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
197e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
197f0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19800 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19810 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19820 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
19830 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19840 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19850 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19860 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19870 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19880 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19890 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
198a0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
198b0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
198c0 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
198d0 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
198e0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
198f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19900 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19910 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19920 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19930 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19940 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19950 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19960 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19970 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19980 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19990 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
199a0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
199b0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
199c0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
199d0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
199e0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
199f0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
19a00 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19a10 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19a20 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19a30 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19a40 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19a50 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19a60 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19a70 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19a80 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19a90 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19aa0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
19ab0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
19ac0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
19ad0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
19ae0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
19af0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
19b00 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19b10 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19b20 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19b30 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19b40 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19b50 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19b60 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19b70 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19b80 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19b90 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19ba0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
19bb0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
19bc0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
19bd0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
19be0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
19bf0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
19c00 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19c10 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19c20 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19c30 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19c40 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19c50 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19c60 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19c70 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19c80 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19c90 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19ca0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19cb0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19cc0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19cd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
19ce0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
19cf0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
19d00 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19d10 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
19d20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19d30 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19d40 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19d50 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19d60 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19d70 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19d80 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19d90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19da0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19db0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19dc0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19dd0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19de0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19df0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19e00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19e10 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19e20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19e30 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
19e40 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
19e50 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19e60 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
19e70 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19e80 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
19e90 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19ea0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19eb0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19ec0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19ed0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19ee0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19ef0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19f00 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19f10 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19f20 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19f30 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
19f40 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
19f50 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19f60 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
19f70 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
19f80 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
19f90 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19fa0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19fb0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
19fc0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
19fd0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19fe0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19ff0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1a000 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1a010 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1a020 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1a030 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1a040 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1a050 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1a060 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1a070 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a080 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a090 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a0a0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a0b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a0c0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1a0d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1a0e0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1a0f0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1a100 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1a110 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1a120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1a130 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a140 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1a150 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1a160 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1a170 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1a180 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1a190 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1a1a0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1a1b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1a1c0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1a1d0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1a1e0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1a1f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a200 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a210 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a220 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a230 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a240 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a250 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a260 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a270 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a280 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a290 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a2a0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a2b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a2c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a2d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a2e0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a2f0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a300 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a310 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a320 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a330 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a340 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a350 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a360 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a370 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a390 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a3a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a3b0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a3c0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a3d0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a3e0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a3f0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a400 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a410 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a420 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a430 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a440 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a450 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a460 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a470 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a480 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a490 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a4a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a4b0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a4c0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a4d0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a4e0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a4f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a500 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a510 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a520 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a530 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a550 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a560 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a570 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a580 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a590 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a5a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a5b0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a5c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a5d0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a5e0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a5f0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a600 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a610 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a620 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a630 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a640 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a650 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a660 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a670 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a680 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a690 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a6a0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a6b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a6c0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a6d0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a6e0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a6f0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a700 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a710 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a720 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a730 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a740 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a750 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a760 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a770 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a780 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a790 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a7a0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a7b0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a7c0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a7d0 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a7e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a7f0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a800 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a810 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a820 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a830 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a840 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1a850 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1a860 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1a870 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1a880 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a890 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1a8a0 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1a8b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1a8c0 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1a8d0 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1a8e0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1a8f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a900 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1a910 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1a920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a930 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1a940 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1a950 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1a960 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1a970 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1a980 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1a990 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1a9a0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1a9b0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1a9c0 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1a9d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1a9e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a9f0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1aa00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1aa10 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1aa20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1aa30 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1aa40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1aa50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1aa60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1aa70 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1aa80 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1aa90 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1aaa0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1aab0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1aac0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1aad0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1aae0 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1aaf0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1ab00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1ab10 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1ab20 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1ab30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1ab40 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1ab50 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1ab60 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1ab70 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1ab80 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1ab90 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1aba0 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1abb0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1abc0 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1abd0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1abe0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1abf0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1ac00 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1ac10 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1ac20 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1ac30 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1ac40 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1ac50 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1ac60 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1ac70 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1ac80 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1ac90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1aca0 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1acb0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1acc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1acd0 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1ace0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1acf0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1ad00 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ad10 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1ad20 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1ad30 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1ad40 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ad50 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1ad60 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ad70 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1ad80 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ad90 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1ada0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1adb0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1adc0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1add0 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1ade0 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1adf0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1ae00 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1ae10 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1ae20 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1ae30 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1ae40 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1ae50 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1ae60 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1ae70 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1ae80 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1ae90 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1aea0 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1aeb0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1aec0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1aed0 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1aee0 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1aef0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1af00 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1af10 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1af20 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1af30 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1af40 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1af50 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1af60 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1af70 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1af80 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1af90 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1afa0 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1afb0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1afc0 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1afd0 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1afe0 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1aff0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1b000 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1b010 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1b020 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1b030 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1b040 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1b050 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1b060 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1b070 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1b080 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1b090 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1b0a0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1b0b0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1b0c0 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1b0d0 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1b0e0 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1b0f0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1b100 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b110 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1b120 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1b130 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f  .  sqlite3 *pBlo
1b140 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ck = 0;.  BtShar
1b150 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b160 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b170 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
1b180 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b190 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b1a0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1b1b0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1b1c0 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1b1d0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1b1e0 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1b1f0 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1b200 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1b210 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1b220 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1b230 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1b240 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1b250 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b260 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1b270 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1b280 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1b290 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b2a0 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1b2b0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b2c0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b2d0 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1b2e0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1b2f0 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
1b300 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
1b310 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
1b320 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
1b330 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1b340 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1b350 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1b360 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
1b370 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
1b380 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1b390 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b3a0 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
1b3b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b3c0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
1b3d0 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1b3e0 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1b3f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1b400 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1b410 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
1b420 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
1b430 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
1b440 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
1b450 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
1b460 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1b470 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1b480 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
1b490 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b4a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b4b0 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42  WRITE).   || (pB
1b4c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1b4d0 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20  S_PENDING)!=0.  
1b4e0 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
1b4f0 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1b500 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
1b510 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
1b520 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
1b530 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1b540 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1b550 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1b560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
1b570 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1b580 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
1b590 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b5a0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
1b5b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b5c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
1b5d0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1b5e0 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1b5f0 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1b600 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1b610 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1b620 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
1b630 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1b640 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1b650 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1b660 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1b670 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1b680 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1b690 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1b6a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1b6b0 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1b6c0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1b6d0 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1b6e0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1b6f0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1b700 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1b710 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1b720 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1b730 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1b740 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1b750 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b760 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1b770 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1b780 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1b790 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1b7a0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1b7b0 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1b7c0 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1b7d0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1b7e0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1b7f0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1b800 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1b810 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1b820 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1b830 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1b840 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1b850 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1b860 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1b870 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1b880 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1b890 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1b8a0 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1b8b0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1b8c0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1b8d0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1b8e0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1b8f0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1b900 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1b910 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1b920 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1b930 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1b940 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1b950 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1b960 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1b970 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1b980 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1b990 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1b9a0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1b9b0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1b9c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b9d0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1b9e0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1b9f0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1ba00 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1ba10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ba20 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1ba30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ba40 20 20 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20       int exFlag 
1ba50 3d 20 28 70 2d 3e 64 62 2d 3e 62 55 6e 6c 6f 63  = (p->db->bUnloc
1ba60 6b 65 64 20 26 26 20 21 49 53 41 55 54 4f 56 41  ked && !ISAUTOVA
1ba70 43 55 55 4d 29 20 3f 20 2d 31 20 3a 20 28 77 72  CUUM) ? -1 : (wr
1ba80 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
1ba90 20 69 6e 74 20 62 53 75 62 6a 49 6e 4d 65 6d 20   int bSubjInMem 
1baa0 3d 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  = sqlite3TempInM
1bab0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 3b 0a 20 20  emory(p->db);.  
1bac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1bad0 3e 64 62 2d 3e 62 55 6e 6c 6f 63 6b 65 64 3d 3d  >db->bUnlocked==
1bae0 30 20 7c 7c 20 77 72 66 6c 61 67 3d 3d 31 20 29  0 || wrflag==1 )
1baf0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1bb00 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1bb10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78  (pBt->pPager, ex
1bb20 46 6c 61 67 2c 20 62 53 75 62 6a 49 6e 4d 65 6d  Flag, bSubjInMem
1bb30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1bb40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bb50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1bb60 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1bb70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bb80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bb90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bba0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
1bbb0 74 72 6d 61 70 28 70 42 74 29 3b 0a 20 20 20 20  trmap(pBt);.    
1bbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bbd0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1bbe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bbf0 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1bc00 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1bc10 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1bc20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1bc30 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1bc40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1bc50 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1bc60 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1bc70 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1bc80 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
1bc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bca0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1bcb0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1bcc0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1bcd0 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1bce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1bcf0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1bd00 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1bd10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1bd20 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1bd30 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1bd40 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1bd50 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1bd60 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1bd70 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1bd80 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1bd90 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1bda0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1bdb0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1bdc0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1bdd0 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1bde0 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1bdf0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1be00 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1be10 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1be20 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1be30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1be40 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1be50 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1be60 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1be70 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1be80 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1be90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1bea0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1beb0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1bec0 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1bed0 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1bee0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1bef0 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1bf00 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1bf10 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1bf20 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1bf30 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1bf40 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1bf50 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1bf60 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1bf70 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1bf80 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1bf90 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1bfa0 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1bfb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bfc0 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1bfd0 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1bfe0 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1bff0 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1c000 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1c010 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1c020 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1c030 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1c040 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1c050 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1c060 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1c070 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1c080 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1c090 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1c0a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c0b0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1c0c0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1c0d0 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1c0e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c0f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1c100 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1c110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c130 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1c140 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1c150 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1c160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c170 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
1c180 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1c190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c1a0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1c1b0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1c1c0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1c1d0 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1c1e0 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1c1f0 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1c200 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1c210 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1c220 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1c230 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1c240 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1c250 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1c260 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1c270 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1c280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1c290 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   nSavepoint = p-
1c2a0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  >db->nSavepoint;
1c2b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c2c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1c2d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1c2e0 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   nSavepoint);.  
1c2f0 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61 70 20    if( pBt->pMap 
1c300 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1c310 20 26 26 20 6e 53 61 76 65 70 6f 69 6e 74 20 29   && nSavepoint )
1c320 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
1c330 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70 42  eePtrmapBegin(pB
1c340 74 2d 3e 70 4d 61 70 2c 20 6e 53 61 76 65 70 6f  t->pMap, nSavepo
1c350 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  int);.    }.  }.
1c360 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1c370 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
1c380 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1c3a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c3b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
1c3c0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
1c3d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
1c3e0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
1c3f0 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
1c400 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
1c410 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
1c420 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1c430 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
1c440 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
1c450 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
1c460 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1c470 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
1c480 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
1c490 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
1c4a0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
1c4b0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4d0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
1c4e0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
1c4f0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c510 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
1c520 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
1c530 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c560 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
1c570 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1c580 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
1c590 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1c5a0 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
1c5b0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1c5c0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1c5d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c5e0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1c5f0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
1c600 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1c610 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1c620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1c630 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
1c640 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
1c650 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1c660 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
1c670 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1c680 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
1c690 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1c6a0 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
1c6b0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
1c6c0 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
1c6d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1c6e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
1c6f0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1c700 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
1c710 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1c720 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1c730 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1c740 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
1c750 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1c760 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1c770 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1c780 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1c790 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1c7a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1c7b0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1c7c0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1c7d0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1c7e0 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
1c7f0 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1c800 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
1c810 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1c820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c830 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1c840 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1c850 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1c860 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1c870 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1c880 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1c890 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1c8a0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1c8b0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1c8c0 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1c8d0 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1c8e0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1c8f0 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1c900 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1c910 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1c920 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1c930 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1c940 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1c950 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1c960 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1c970 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1c980 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1c990 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1c9a0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1c9c0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1c9d0 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1c9e0 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1c9f0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ca00 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1ca10 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1ca20 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1ca30 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1ca60 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1ca70 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1ca80 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1ca90 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1caa0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1cab0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1cac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cad0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1cae0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1caf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cb00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1cb10 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1cb20 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1cb30 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1cb40 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1cb50 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1cb60 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1cb70 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1cb80 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1cb90 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1cba0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1cbb0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1cbc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cbd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1cbe0 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1cbf0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1cc00 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1cc10 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
1cc20 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1cc30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1cc40 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
1cc50 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20  int rc;..    rc 
1cc60 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1cc70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1cc80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1cc90 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1cca0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1ccb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1ccc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1ccd0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1cce0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1ccf0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1cd00 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1cd10 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1cd20 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1cd30 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1cd40 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1cd50 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1cd60 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
1cd70 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20  low.         && 
1cd80 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
1cd90 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61  flow+3<=pPage->a
1cda0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
1cdb0 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26  Page.         &&
1cdc0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1cdd0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
1cde0 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20  erflow]).       
1cdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1ce00 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
1ce10 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
1ce20 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1ce30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1ce40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ce50 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1ce60 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1ce70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1ce80 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1ce90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1cea0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1ceb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1cec0 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1ced0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1cee0 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1cef0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1cf00 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1cf10 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1cf20 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1cf30 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1cf40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1cf50 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
1cf60 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1cf70 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1cf80 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1cf90 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
1cfa0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
1cfb0 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1cfc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1cfd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1cfe0 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1cff0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1d000 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1d010 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1d020 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1d030 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1d040 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1d050 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1d060 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1d070 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1d080 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1d090 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1d0a0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1d0b0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1d0c0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1d0d0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1d0e0 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1d0f0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1d100 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1d110 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1d120 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1d130 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1d140 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1d150 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1d160 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1d170 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1d180 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1d190 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1d1a0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1d1b0 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d1d0 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1d1e0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1d1f0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1d200 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1d210 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1d220 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1d230 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1d240 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1d250 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1d260 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1d270 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1d280 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1d290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1d2a0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1d2b0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1d2c0 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1d2d0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1d2e0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1d2f0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1d300 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1d310 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1d320 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1d330 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1d340 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1d350 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1d360 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1d370 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1d380 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1d390 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1d3a0 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1d3b0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1d3c0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1d3d0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1d3e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d3f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d400 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d410 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1d420 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1d430 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1d440 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1d450 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1d460 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1d470 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1d480 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1d490 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1d4a0 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1d4b0 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1d4c0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1d4d0 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1d4e0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1d4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d500 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1d510 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1d520 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1d530 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1d540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d550 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d560 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1d570 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1d580 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1d590 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1d5a0 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1d5b0 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1d5c0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1d5d0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1d5e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1d5f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1d600 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1d610 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1d620 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1d630 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1d640 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1d650 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1d660 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1d670 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1d680 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1d690 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1d6a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1d6b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1d6c0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1d6d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1d6e0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1d6f0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1d700 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1d710 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1d720 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1d730 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1d740 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d750 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1d760 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1d770 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d7a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d7b0 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1d7c0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1d7d0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1d7e0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1d7f0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1d800 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1d810 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d820 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1d830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d850 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d870 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1d880 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1d890 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1d8a0 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1d8b0 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1d8c0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1d8d0 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1d8e0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1d8f0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1d900 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1d910 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d920 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1d930 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1d940 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1d950 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1d960 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1d970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d980 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d990 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1d9a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d9b0 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1d9c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1d9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d9e0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1d9f0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1da00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1da10 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1da20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1da30 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1da40 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1da50 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1da60 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1da70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1da80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1da90 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1daa0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1dab0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1dac0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1dad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1dae0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1daf0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1db00 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1db10 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1db20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1db30 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1db40 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1db50 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1db60 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1db70 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1db80 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1db90 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1dba0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1dbb0 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1dbc0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1dbd0 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1dbe0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1dbf0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1dc00 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1dc10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1dc20 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1dc30 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1dc40 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1dc50 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1dc60 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1dc70 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1dc80 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1dc90 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1dca0 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1dcb0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1dcc0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1dcd0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1dce0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1dcf0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1dd00 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1dd10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1dd20 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1dd30 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1dd40 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1dd50 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1dd60 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1dd70 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1dd80 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1dd90 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1dda0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1ddb0 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1ddc0 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1ddd0 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1dde0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1ddf0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1de00 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1de10 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1de20 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1de30 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1de40 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1de50 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1de60 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1de70 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1de80 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1de90 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1dea0 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1deb0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1dec0 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1ded0 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1dee0 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1def0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1df00 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1df10 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1df20 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1df30 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1df40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1df50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1df60 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1df70 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1df80 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1df90 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1dfa0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1dfb0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1dfc0 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1dfd0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1dfe0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1dff0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1e000 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e010 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1e020 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1e030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e040 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1e050 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1e060 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1e070 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1e080 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1e090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e0a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e0b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1e0c0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1e0d0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1e0e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e0f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1e100 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1e110 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1e120 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1e130 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1e140 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1e150 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1e160 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1e170 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1e180 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1e190 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1e1a0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1e1b0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1e1c0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1e1d0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1e1e0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1e1f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1e200 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1e210 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1e220 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1e230 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1e240 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1e250 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e260 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1e270 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1e280 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1e290 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1e2a0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1e2b0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1e2c0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1e2d0 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1e2e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e2f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e320 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e330 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1e340 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e350 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1e360 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1e370 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1e380 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1e390 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1e3a0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1e3b0 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1e3c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1e3d0 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1e3e0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1e3f0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1e400 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1e410 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1e420 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1e430 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1e440 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1e450 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1e460 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1e470 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1e480 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1e490 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1e4a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1e4b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e4c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e4d0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1e4e0 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1e4f0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1e500 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1e510 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1e520 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1e530 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1e540 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1e550 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1e560 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1e570 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1e580 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1e590 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1e5a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1e5b0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1e5c0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1e5d0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1e5e0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1e5f0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1e600 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1e610 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1e620 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1e630 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1e640 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1e650 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1e660 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1e670 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1e680 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1e690 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1e6a0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1e6b0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1e6c0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1e6d0 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1e6e0 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1e6f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e710 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1e720 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1e730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1e750 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1e760 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1e770 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1e780 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1e790 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1e7a0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1e7b0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1e7c0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1e7d0 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1e7e0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1e7f0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1e800 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e810 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1e820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1e840 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1e850 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e860 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1e870 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1e880 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1e890 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1e8a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e8b0 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1e8c0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1e8d0 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1e8e0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1e8f0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1e900 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1e910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e920 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1e930 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1e940 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1e950 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1e960 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e970 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1e980 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1e990 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1e9a0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1e9b0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1e9c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e9d0 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1e9e0 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1e9f0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1ea00 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1ea10 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1ea20 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1ea30 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1ea40 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ea70 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1ea80 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1ea90 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1eac0 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1ead0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1eae0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb00 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1eb10 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1eb20 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1eb30 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1eb40 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1eb50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1eb60 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1eb70 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1eb80 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1eb90 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1eba0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ebb0 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1ebc0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ebd0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1ebe0 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1ebf0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1ec00 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1ec10 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1ec20 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ec30 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1ec40 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1ec50 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1ec60 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1ec70 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1ec80 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1ec90 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1eca0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1ecb0 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1ecc0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1ecd0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1ece0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1ecf0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1ed00 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1ed10 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1ed20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1ed30 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1ed40 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1ed50 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1ed60 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1ed70 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ed80 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1ed90 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1eda0 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1edb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1edc0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1edd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1ede0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1edf0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1ee00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1ee10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1ee20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1ee30 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1ee40 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ee50 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1ee60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ee70 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ee80 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1ee90 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1eea0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1eeb0 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1eec0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1eed0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1eee0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1eef0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1ef00 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1ef10 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1ef20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1ef30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ef40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ef50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1ef60 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1ef70 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1ef80 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1ef90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1efa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1efb0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1efc0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1efd0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1efe0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1eff0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1f000 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1f010 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f040 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1f050 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f060 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f070 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f080 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1f090 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1f0a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f0b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1f0c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1f0d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f0e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1f0f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1f100 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1f110 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1f120 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1f130 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1f140 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1f150 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1f160 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1f170 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1f180 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1f190 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1f1a0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1f1b0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1f1c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1f1d0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1f1e0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1f1f0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1f200 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1f210 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1f220 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1f230 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1f240 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1f250 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1f260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1f270 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1f280 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1f290 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f2a0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1f2b0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1f2c0 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1f2d0 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1f2e0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1f2f0 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
1f300 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f310 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1f320 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1f330 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1f340 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1f350 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1f360 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1f370 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1f380 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1f390 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f3a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1f3b0 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1f3c0 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1f3d0 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1f3e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f3f0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1f400 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1f410 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1f420 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1f430 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1f440 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1f450 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1f460 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1f470 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1f480 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1f490 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1f4a0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1f4b0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f4c0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1f4d0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1f4e0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1f4f0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1f500 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1f510 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1f520 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1f530 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1f540 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1f550 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1f560 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1f570 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1f580 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1f590 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1f5a0 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1f5b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f5c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f5d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f5e0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1f5f0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1f600 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f610 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1f620 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1f630 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1f640 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1f650 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f660 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f670 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1f680 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1f690 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1f6a0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1f6b0 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1f6c0 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1f6d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1f6e0 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1f6f0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1f700 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1f710 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1f720 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1f730 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1f740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1f750 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1f760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f770 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1f780 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f790 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f7a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f7b0 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1f7c0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f7d0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1f7e0 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1f7f0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f800 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1f810 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1f820 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1f830 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1f840 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1f850 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1f860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f870 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1f880 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1f890 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1f8a0 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1f8b0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1f8c0 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1f8d0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1f8e0 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1f8f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f900 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1f910 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1f920 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1f930 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 2d 74 72  ../*.** The b-tr
1f940 65 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  ee handle passed
1f950 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1f960 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
1f970 6f 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a 2a 20 55  o commit an.** U
1f980 4e 4c 4f 43 4b 45 44 20 74 72 61 6e 73 61 63 74  NLOCKED transact
1f990 69 6f 6e 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ion. At this poi
1f9a0 6e 74 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  nt it is guarant
1f9b0 65 65 64 20 74 68 61 74 20 74 68 69 73 20 69 73  eed that this is
1f9c0 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 2d 20   .** possible - 
1f9d0 74 68 65 20 77 61 6c 20 57 52 49 54 45 52 20 6c  the wal WRITER l
1f9e0 6f 63 6b 20 69 73 20 68 65 6c 64 20 61 6e 64 20  ock is held and 
1f9f0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74  it is known that
1fa00 20 74 68 65 72 65 20 61 72 65 20 0a 2a 2a 20 6e   there are .** n
1fa10 6f 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  o conflicts with
1fa20 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73   committed trans
1fa30 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  actions..*/.stat
1fa40 69 63 20 69 6e 74 20 62 74 72 65 65 46 69 78 55  ic int btreeFixU
1fa50 6e 6c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70  nlocked(Btree *p
1fa60 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1fa70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
1fa80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1fa90 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1faa0 75 38 20 2a 70 31 20 3d 20 70 50 61 67 65 31 2d  u8 *p1 = pPage1-
1fab0 3e 61 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >aData;.  Pager 
1fac0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1fad0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1fae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1faf0 2f 2a 20 49 66 20 70 61 67 65 20 31 20 6f 66 20  /* If page 1 of 
1fb00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fb10 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
1fb20 65 6e 20 6e 6f 20 70 61 67 65 73 20 77 65 72 65  en no pages were
1fb30 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
1fb40 6f 72 20 66 72 65 65 64 20 62 79 20 74 68 69 73  or freed by this
1fb50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1fb60 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 73 70   this case no sp
1fb70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69  ecial handling i
1fb80 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
1fb90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1fba0 70 61 67 65 20 31 20 69 73 20 64 69 72 74 79 2c  page 1 is dirty,
1fbb0 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
1fbc0 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61  BtreePtrmap *pMa
1fbd0 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20  p = pBt->pMap;. 
1fbe0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 67   Pgno iTrunk = g
1fbf0 65 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 29  et4byte(&p1[32])
1fc00 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d  ;.  Pgno nPage =
1fc10 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1fc20 70 42 74 29 3b 0a 20 20 75 33 32 20 6e 46 72 65  pBt);.  u32 nFre
1fc30 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31  e = get4byte(&p1
1fc40 5b 33 36 5d 29 3b 0a 0a 20 20 61 73 73 65 72 74  [36]);..  assert
1fc50 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1fc60 55 6e 6c 6f 63 6b 65 64 28 70 50 61 67 65 72 29  Unlocked(pPager)
1fc70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1fc80 74 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20  t->pMap );.  rc 
1fc90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70  = sqlite3PagerUp
1fca0 67 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50  gradeSnapshot(pP
1fcb0 61 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44  ager, pPage1->pD
1fcc0 62 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  bPage);.  assert
1fcd0 28 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44  ( p1==pPage1->aD
1fce0 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  ata );..  if( rc
1fcf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fd00 20 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d     Pgno nHPage =
1fd10 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38   get4byte(&p1[28
1fd20 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1fd30 6e 61 6c 20 3d 20 6e 48 50 61 67 65 3b 20 20 20  nal = nHPage;   
1fd40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fd50 20 64 62 20 61 66 74 65 72 20 74 72 61 6e 73 61   db after transa
1fd60 63 74 69 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a  ction merge */..
1fd70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1fd80 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1fd90 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1fda0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   ){.      Pgno i
1fdb0 48 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  HTrunk = get4byt
1fdc0 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20  e(&p1[32]);.    
1fdd0 20 20 75 33 32 20 6e 48 46 72 65 65 20 3d 20 67    u32 nHFree = g
1fde0 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29  et4byte(&p1[36])
1fdf0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 61  ;..      /* Atta
1fe00 63 68 20 74 68 65 20 68 65 61 64 20 64 61 74 61  ch the head data
1fe10 62 61 73 65 20 66 72 65 65 20 6c 69 73 74 20 74  base free list t
1fe20 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1fe30 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 2a   current.      *
1fe40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 66  * transactions f
1fe50 72 65 65 2d 6c 69 73 74 20 28 69 66 20 61 6e 79  ree-list (if any
1fe60 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ).  */.      if(
1fe70 20 69 54 72 75 6e 6b 21 3d 30 20 29 7b 0a 20 20   iTrunk!=0 ){.  
1fe80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1fe90 70 31 5b 33 36 5d 2c 20 6e 48 46 72 65 65 20 2b  p1[36], nHFree +
1fea0 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20   nFree);.       
1feb0 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 33 32   put4byte(&p1[32
1fec0 5d 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  ], iTrunk);.    
1fed0 20 20 20 20 77 68 69 6c 65 28 20 69 54 72 75 6e      while( iTrun
1fee0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44  k ){.          D
1fef0 62 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  bPage *pTrunk = 
1ff00 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1ff10 75 70 28 70 50 61 67 65 72 2c 20 69 54 72 75 6e  up(pPager, iTrun
1ff20 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54  k);.          iT
1ff30 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1ff40 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61  (u8*)pTrunk->pDa
1ff50 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ta);.          i
1ff60 66 28 20 69 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a  f( iTrunk==0 ){.
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1ff80 62 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b  byte((u8*)pTrunk
1ff90 2d 3e 70 44 61 74 61 2c 20 69 48 54 72 75 6e 6b  ->pData, iHTrunk
1ffa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1ffb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ffc0 50 61 67 65 72 55 6e 72 65 66 28 70 54 72 75 6e  PagerUnref(pTrun
1ffd0 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20  k);.        };. 
1ffe0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1fff0 28 20 6e 48 50 61 67 65 3c 28 70 4d 61 70 2d 3e  ( nHPage<(pMap->
20000 69 46 69 72 73 74 2d 31 29 20 29 7b 0a 20 20 20  iFirst-1) ){.   
20010 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
20020 62 61 73 65 20 63 6f 6e 73 69 73 74 65 64 20 6f  base consisted o
20030 66 20 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d  f (pMap->iFirst-
20040 31 29 20 70 61 67 65 73 20 77 68 65 6e 20 74 68  1) pages when th
20050 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
20060 20 20 2a 2a 20 75 6e 6c 6f 63 6b 65 64 20 74 72    ** unlocked tr
20070 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
20080 65 6e 65 64 2e 20 41 6e 64 20 61 6e 20 75 6e 6c  ened. And an unl
20090 6f 63 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  ocked transactio
200a0 6e 20 6d 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  n may.        **
200b0 20 6e 6f 74 20 62 65 20 65 78 65 63 75 74 65 64   not be executed
200c0 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   on an auto-vacu
200d0 75 6d 20 64 61 74 61 62 61 73 65 20 2d 20 73 6f  um database - so
200e0 20 74 68 65 20 64 62 20 73 68 6f 75 6c 64 20 0a   the db should .
200f0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68          ** not h
20100 61 76 65 20 73 68 72 75 6e 6b 20 73 69 6e 63 65  ave shrunk since
20110 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20120 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65   was opened. The
20130 72 65 66 6f 72 65 20 6e 48 50 61 67 65 0a 20 20  refore nHPage.  
20140 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
20150 62 65 20 73 65 74 20 74 6f 20 28 70 4d 61 70 2d  be set to (pMap-
20160 3e 69 46 69 72 73 74 2d 31 29 20 6f 72 20 67 72  >iFirst-1) or gr
20170 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eater. */.      
20180 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
20190 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
201a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
201b0 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
201c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f  transaction allo
201d0 63 61 74 65 64 20 70 61 67 65 73 20 70 4d 61 70  cated pages pMap
201e0 2d 3e 69 46 69 72 73 74 20 74 68 72 6f 75 67 68  ->iFirst through
201f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 50 61 67  .        ** nPag
20200 65 20 28 69 6e 63 6c 75 73 69 76 65 29 20 61 74  e (inclusive) at
20210 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4d  database file. M
20230 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20 20  eanwhile,.      
20240 20 20 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e 73    ** other trans
20250 61 63 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c  actions have all
20260 6f 63 61 74 65 64 20 28 69 46 69 72 73 74 2e 2e  ocated (iFirst..
20270 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65  nHPage). So move
20280 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
20290 73 20 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e  s (iFirst..MIN(n
202a0 50 61 67 65 2c 6e 48 50 61 67 65 29 29 20 74 6f  Page,nHPage)) to
202b0 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50 61   (MAX(nPage,nHPa
202c0 67 65 29 2b 31 29 2e 0a 20 20 20 20 20 20 20 20  ge)+1)..        
202d0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
202e0 69 4c 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67  iLast = MIN(nPag
202f0 65 2c 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f  e, nHPage);    /
20300 2a 20 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d  * Last page to m
20310 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50  ove */.        P
20320 67 6e 6f 20 69 50 67 3b 0a 20 20 20 20 20 20 20  gno iPg;.       
20330 20 50 67 6e 6f 20 6e 43 75 72 72 65 6e 74 3b 20   Pgno nCurrent; 
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
20360 73 69 7a 65 20 6f 66 20 64 62 20 2a 2f 0a 20 20  size of db */.  
20370 20 20 20 20 20 20 6e 43 75 72 72 65 6e 74 20 3d        nCurrent =
20380 20 4d 41 58 28 6e 50 61 67 65 2c 20 6e 48 50 61   MAX(nPage, nHPa
20390 67 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f  ge);..        fo
203a0 72 28 69 50 67 3d 70 4d 61 70 2d 3e 69 46 69 72  r(iPg=pMap->iFir
203b0 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20 26  st; iPg<=iLast &
203c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
203d0 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
203e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
203f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50  = 0;.          P
20400 67 6e 6f 20 69 4e 65 77 3b 20 20 20 20 20 20 20  gno iNew;       
20410 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
20420 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
20430 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50  g */.          P
20440 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
20450 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ry;    /* Pointe
20460 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
20470 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20  page iPg */..   
20480 20 20 20 20 20 20 20 70 45 6e 74 72 79 20 3d 20         pEntry = 
20490 26 70 4d 61 70 2d 3e 61 50 74 72 5b 69 50 67 20  &pMap->aPtr[iPg 
204a0 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 5d 3b  - pMap->iFirst];
204b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
204c0 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d 50 54  Entry->eType==PT
204d0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
204e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 65 6d  .            Mem
204f0 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20 30 3b  Page *pFree = 0;
20500 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 67 6e  .            Pgn
20510 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  o dummy;.       
20520 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
20530 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
20540 20 26 70 46 72 65 65 2c 20 26 64 75 6d 6d 79 2c   &pFree, &dummy,
20550 20 69 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58   iPg, BTALLOC_EX
20560 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ACT);.          
20570 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
20580 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
20590 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
205a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79  LITE_OK || dummy
205b0 3d 3d 69 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ==iPg );.       
205c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
205d0 20 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61        btreeGetPa
205e0 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50  ge(pBt, iPg, &pP
205f0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  g, 0);.         
20600 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
20610 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
20620 6c 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  le(pPg->pDbPage)
20630 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
20650 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
20660 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3d 3d  (pPg->pDbPage)==
20670 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
20680 20 69 4e 65 77 20 3d 20 2b 2b 6e 43 75 72 72 65   iNew = ++nCurre
20690 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt;.            
206a0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
206b0 65 28 70 42 74 2c 20 70 50 67 2c 20 70 45 6e 74  e(pBt, pPg, pEnt
206c0 72 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74 72  ry->eType, pEntr
206d0 79 2d 3e 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c  y->parent, iNew,
206e0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
206f0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
20700 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ull(pPg);.      
20710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20730 61 67 65 72 53 65 74 44 62 73 69 7a 65 28 70 50  agerSetDbsize(pP
20740 61 67 65 72 2c 20 6e 43 75 72 72 65 6e 74 29 3b  ager, nCurrent);
20750 0a 0a 20 20 20 20 20 20 20 20 6e 46 72 65 65 20  ..        nFree 
20760 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33  = get4byte(&p1[3
20770 36 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69  6]);.        nFi
20780 6e 61 6c 20 3d 20 4d 41 58 28 6e 43 75 72 72 65  nal = MAX(nCurre
20790 6e 74 2d 6e 46 72 65 65 2c 20 6e 48 50 61 67 65  nt-nFree, nHPage
207a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  );..        for(
207b0 69 50 67 3d 6e 46 69 6e 61 6c 2b 31 3b 20 72 63  iPg=nFinal+1; rc
207c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
207d0 50 67 3c 6e 43 75 72 72 65 6e 74 3b 20 69 50 67  Pg<nCurrent; iPg
207e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
207f0 67 6e 6f 20 69 4e 65 77 3b 20 20 20 20 20 20 20  gno iNew;       
20800 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
20810 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
20820 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d  g */.          M
20830 65 6d 50 61 67 65 20 2a 70 46 72 65 65 3b 0a 20  emPage *pFree;. 
20840 20 20 20 20 20 20 20 20 20 50 74 72 6d 61 70 45           PtrmapE
20850 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 20 20 20  ntry *pEntry;   
20860 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
20870 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 69  entry for page i
20880 50 67 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  Pg */..         
20890 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d   pEntry = &pMap-
208a0 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70  >aPtr[iPg - pMap
208b0 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  ->iFirst];.     
208c0 20 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d       if( pEntry-
208d0 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46  >eType==PTRMAP_F
208e0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
208f0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
20900 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
20910 74 2c 20 26 70 46 72 65 65 2c 20 26 69 4e 65 77  t, &pFree, &iNew
20920 2c 20 69 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  , iPg, BTALLOC_E
20930 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 20  XACT);.         
20940 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20950 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
20960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20970 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
20980 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
20990 26 70 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 6e  &pFree, &iNew, n
209a0 46 69 6e 61 6c 2c 20 42 54 41 4c 4c 4f 43 5f 4c  Final, BTALLOC_L
209b0 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  E);.            
209c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
209d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
209e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
209f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
20a00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
20a10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
20a20 20 20 20 62 74 72 65 65 47 65 74 50 61 67 65 28     btreeGetPage(
20a30 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20  pBt, iPg, &pPg, 
20a40 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20a50 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
20a60 61 67 65 28 70 42 74 2c 20 70 50 67 2c 20 70 45  age(pBt, pPg, pE
20a70 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e  ntry->eType, pEn
20a80 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69 4e 65 77  try->parent,iNew
20a90 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,1);.           
20aa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
20ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20ac0 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 32 38   put4byte(&p1[28
20ad0 5d 2c 20 6e 46 69 6e 61 6c 29 3b 0a 20 20 20 20  ], nFinal);.    
20ae0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
20af0 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73  lite3PagerSetDbs
20b00 69 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69 6e  ize(pPager, nFin
20b10 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  al);.  }..  retu
20b20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20b30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
20b40 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
20b50 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
20b60 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
20b70 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
20b80 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
20b90 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
20ba0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
20bb0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
20bc0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
20bd0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
20be0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
20bf0 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
20c00 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
20c10 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
20c20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
20c30 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
20c40 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
20c50 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
20c60 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
20c70 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
20c80 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
20c90 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
20ca0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
20cb0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
20cc0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
20cd0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
20ce0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
20cf0 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
20d00 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
20d10 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
20d20 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
20d30 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
20d40 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20d50 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
20d60 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
20d70 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
20d80 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
20d90 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
20da0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
20db0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
20dc0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20dd0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
20de0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
20df0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
20e00 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
20e10 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
20e20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
20e30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
20e40 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
20e50 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
20e60 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
20e70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20e80 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
20e90 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
20ea0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
20eb0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
20ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
20ed0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
20ee0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
20ef0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
20f00 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
20f10 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
20f20 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
20f30 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
20f40 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
20f50 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
20f60 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
20f70 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
20f80 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
20f90 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
20fa0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
20fb0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
20fc0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
20fd0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
20fe0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
20ff0 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
21000 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
21010 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
21020 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
21030 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
21040 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
21050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21060 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
21070 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
21080 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21090 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
210a0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
210b0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
210c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
210d0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
210e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
210f0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
21100 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21110 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21120 74 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66  ter(p);..#ifndef
21130 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21140 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 46  OVACUUM.    /* F
21150 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69  igure out if thi
21160 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 6f 66  s is a commit of
21170 20 61 6e 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61   an UNLOCKED tra
21180 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 0a 20  nsaction that . 
21190 20 20 20 2a 2a 20 72 65 71 75 69 72 65 73 20 61     ** requires a
211a0 20 73 6e 61 70 73 68 6f 74 20 75 70 67 72 61 64   snapshot upgrad
211b0 65 2e 20 49 66 20 73 6f 2c 20 73 6b 69 70 20 61  e. If so, skip a
211c0 6e 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 0a  ny auto-vacuum .
211d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
211e0 67 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  g.  */.    if( p
211f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
21200 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21210 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 55 6e  sqlite3PagerIsUn
21220 6c 6f 63 6b 65 64 28 70 42 74 2d 3e 70 50 61 67  locked(pBt->pPag
21230 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  er)==0 );.      
21240 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
21250 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
21260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
21280 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21290 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
212a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
212b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
212c0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
212d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
212e0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
212f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
21300 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
21310 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
21320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21330 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  & sqlite3PagerIs
21340 55 6e 6c 6f 63 6b 65 64 28 70 42 74 2d 3e 70 50  Unlocked(pBt->pP
21350 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
21360 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e 6c 6f  c = btreeFixUnlo
21370 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20  cked(p);.    }. 
21380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
213a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
213b0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
213c0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
213d0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
213e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
213f0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
21400 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21410 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21420 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
21430 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
21440 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
21450 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
21460 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
21470 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
21480 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
21490 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
214a0 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
214b0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
214c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
214d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
214e0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
214f0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
21500 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e  utex(p) );..#ifn
21510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21520 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74  AUTOVACUUM.  pBt
21530 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
21540 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  0;.#endif.  if( 
21550 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
21560 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64  _NONE && db->nVd
21570 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20  beRead>1 ){.    
21580 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
21590 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
215a0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
215b0 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
215c0 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
215d0 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
215e0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
215f0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
21600 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
21610 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
21620 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
21630 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
21640 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
21650 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
21660 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
21670 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
21680 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
21690 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
216a0 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
216b0 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
216c0 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
216d0 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
216e0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
216f0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
21700 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
21710 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
21720 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
21730 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
21740 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21750 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
21760 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
21770 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
21780 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
21790 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
217a0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
217b0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
217c0 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
217d0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
217e0 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
217f0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
21800 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
21810 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
21820 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
21830 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
21840 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
21850 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21860 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
21870 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
21880 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
21890 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
218a0 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
218b0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
218c0 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
218d0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
218e0 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
218f0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
21900 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
21910 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
21920 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pBt);.  }..  /*
21930 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
21940 55 4e 4c 4f 43 4b 45 44 20 74 72 61 6e 73 61 63  UNLOCKED transac
21950 74 69 6f 6e 2c 20 64 65 6c 65 74 65 20 74 68 65  tion, delete the
21960 20 70 42 74 2d 3e 70 4d 61 70 20 6f 62 6a 65 63   pBt->pMap objec
21970 74 20 2a 2f 0a 20 20 64 65 6c 65 74 65 50 74 72  t */.  deletePtr
21980 6d 61 70 28 70 42 74 29 3b 0a 20 20 62 74 72 65  map(pBt);.  btre
21990 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
219a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
219b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
219c0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
219d0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
219e0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
219f0 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
21a00 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
21a10 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
21a20 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
21a30 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
21a40 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
21a50 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
21a60 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
21a70 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
21a80 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
21a90 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
21aa0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21ab0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
21ac0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
21ad0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
21ae0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
21af0 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
21b00 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
21b10 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
21b20 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
21b30 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
21b40 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
21b50 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
21b60 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
21b70 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
21b80 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
21b90 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
21ba0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
21bb0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
21bc0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
21bd0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
21be0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
21bf0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
21c00 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
21c10 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
21c20 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
21c30 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
21c40 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
21c50 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
21c60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21c70 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
21c80 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
21c90 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
21ca0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
21cb0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
21cc0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
21cd0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
21ce0 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
21cf0 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
21d00 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
21d10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
21d20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
21d30 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
21d40 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
21d50 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
21d60 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
21d70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
21d80 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
21d90 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
21da0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
21db0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
21dc0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
21dd0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
21de0 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
21df0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
21e00 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
21e10 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
21e20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
21e30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
21e40 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
21e50 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
21e60 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
21e70 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
21e80 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
21e90 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
21ea0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
21eb0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
21ec0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21ed0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
21ee0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
21ef0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
21f00 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
21f10 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
21f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21f30 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
21f40 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
21f50 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
21f60 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21f70 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
21f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
21f90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
21fa0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
21fb0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
21fc0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
21fd0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
21fe0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
21ff0 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
22000 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
22010 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
22020 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
22030 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
22040 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
22050 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
22060 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
22070 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
22080 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
22090 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
220a0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
220b0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
220c0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
220d0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
220e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
220f0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
22100 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
22110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22120 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
22130 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
22140 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
22150 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
22160 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
22170 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
22180 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
22190 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
221a0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
221b0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
221c0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
221d0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
221e0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
221f0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
22200 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
22210 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
22220 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
22230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22240 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
22250 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
22260 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
22270 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
22280 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
22290 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
222a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
222b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
222c0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
222d0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
222e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
222f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22300 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
22310 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
22320 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22340 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
22350 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
22360 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
22370 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
22380 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
22390 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
223a0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
223b0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
223c0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
223d0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
223e0 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
223f0 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
22400 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
22410 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
22420 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
22430 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
22440 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
22450 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
22460 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
22470 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
22480 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
22490 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
224a0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
224b0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
224c0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
224d0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
224e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
224f0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
22500 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
22510 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
22520 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
22530 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
22540 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
22550 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
22560 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
22570 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
22580 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
22590 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
225a0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
225b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
225c0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
225d0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
225e0 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
225f0 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
22600 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
22610 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
22620 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
22630 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
22640 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
22650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
22660 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
22670 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
22680 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
22690 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
226a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
226b0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
226c0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
226d0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
226e0 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
226f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
22700 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
22710 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
22720 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
22730 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
22740 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
22750 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
22760 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
22770 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
22780 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
22790 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
227a0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
227b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
227c0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
227d0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
227e0 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
227f0 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
22800 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
22810 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
22820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22830 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
22840 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
22850 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
22860 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22870 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
22880 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22890 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
228a0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
228b0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
228c0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
228d0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
228e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
228f0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
22900 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
22910 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
22920 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
22930 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
22940 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
22950 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
22960 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
22970 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
22980 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
22990 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
229a0 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
229b0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
229c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
229d0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
229e0 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
229f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22a00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22a10 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
22a20 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
22a30 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
22a40 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
22a50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22a60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22a80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
22a90 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
22aa0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
22ab0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
22ac0 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
22ad0 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
22ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
22af0 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
22b00 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
22b10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
22b20 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
22b30 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
22b40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
22b50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
22b60 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
22b70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22b80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
22b90 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
22ba0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
22bb0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
22bc0 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
22bd0 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
22be0 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
22bf0 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
22c00 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
22c10 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
22c20 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
22c30 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
22c40 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
22c50 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
22c60 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
22c70 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
22c80 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
22c90 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
22ca0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
22cb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
22cc0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
22cd0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
22ce0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
22cf0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
22d00 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
22d10 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
22d20 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
22d30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
22d40 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
22d50 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
22d60 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
22d70 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
22d80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22d90 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
22da0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
22db0 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
22dc0 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
22dd0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
22de0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
22df0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
22e00 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
22e10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
22e20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22e30 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
22e40 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
22e50 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
22e60 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
22e70 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
22e80 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
22e90 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
22ea0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
22eb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
22ec0 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
22ed0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
22ee0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
22ef0 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
22f00 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
22f10 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
22f20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
22f30 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
22f40 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
22f50 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
22f60 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
22f70 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
22f80 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
22f90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
22fa0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
22fb0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
22fc0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
22fd0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
22fe0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
22ff0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
23000 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
23010 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
23020 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
23030 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
23040 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
23050 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
23060 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
23070 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
23080 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
23090 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
230a0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
230b0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
230c0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
230d0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
230e0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
230f0 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
23100 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
23110 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
23120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
23130 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
23140 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
23150 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
23160 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
23170 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
23180 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
23190 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
231a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
231b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
231c0 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
231d0 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
231e0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
231f0 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
23200 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
23210 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23220 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
23230 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
23240 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
23250 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
23260 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
23270 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
23280 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
23290 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
232a0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
232b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
232c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
232d0 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
232e0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
232f0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
23300 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
23310 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
23320 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
23330 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
23340 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
23350 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
23360 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
23370 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
23380 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
23390 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
233a0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
233b0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
233c0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
233d0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
233e0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
233f0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
23400 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
23410 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
23420 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
23430 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
23440 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
23450 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
23460 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
23470 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
23480 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
23490 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
234a0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
234b0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
234c0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
234d0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
234e0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
234f0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
23500 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
23510 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
23520 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
23530 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
23540 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
23550 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
23560 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23570 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
23580 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
23590 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
235a0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
235b0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
235c0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
235d0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
235e0 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
235f0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
23600 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
23610 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
23620 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
23630 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
23640 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
23650 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
23660 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
23670 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
23680 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
23690 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
236a0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
236b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
236c0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
236d0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
236e0 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
236f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
23700 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
23710 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
23720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
23730 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
23740 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
23750 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
23760 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
23770 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23780 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
23790 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
237a0 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
237b0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
237c0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
237d0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
237e0 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
237f0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
23800 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
23810 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
23820 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
23830 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
23840 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
23850 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
23860 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
23870 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
23880 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
23890 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
238a0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
238b0 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
238c0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
238d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
238e0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
238f0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
23900 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
23910 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
23920 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
23930 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
23940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23950 4b 20 26 26 20 70 42 74 2d 3e 70 4d 61 70 20 29  K && pBt->pMap )
23960 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
23970 50 74 72 6d 61 70 42 65 67 69 6e 28 70 42 74 2d  PtrmapBegin(pBt-
23980 3e 70 4d 61 70 2c 20 69 53 74 61 74 65 6d 65 6e  >pMap, iStatemen
23990 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
239a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
239b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
239c0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
239d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
239e0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
239f0 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
23a00 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
23a10 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
23a20 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
23a30 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
23a40 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
23a50 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
23a60 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
23a70 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
23a80 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
23a90 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
23aa0 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
23ab0 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
23ac0 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
23ad0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
23ae0 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
23af0 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
23b00 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
23b10 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
23b20 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
23b30 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
23b40 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
23b50 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
23b60 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
23b70 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
23b80 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
23b90 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
23ba0 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
23bb0 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
23bc0 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
23bd0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
23be0 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
23bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23c00 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
23c10 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
23c20 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
23c30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23c40 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
23c50 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23c60 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
23c70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23c80 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
23c90 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
23ca0 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
23cb0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
23cc0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
23cd0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
23ce0 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
23cf0 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
23d00 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
23d10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
23d20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69  eEnter(p);.    i
23d30 66 28 20 70 42 74 2d 3e 70 4d 61 70 20 29 20 62  f( pBt->pMap ) b
23d40 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28 70 42  treePtrmapEnd(pB
23d50 74 2d 3e 70 4d 61 70 2c 20 6f 70 2c 20 69 53 61  t->pMap, op, iSa
23d60 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 72 63  vepoint);.    rc
23d70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
23d80 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
23d90 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
23da0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
23db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23dc0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
23dd0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
23de0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
23df0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
23e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
23e10 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
23e20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
23e30 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
23e40 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
23e50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
23e60 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
23e70 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
23e80 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
23e90 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
23ea0 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
23eb0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
23ec0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
23ed0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
23ee0 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
23ef0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
23f00 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
23f10 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
23f20 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
23f30 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
23f40 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
23f50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23f60 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23f70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23f80 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
23f90 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
23fa0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
23fb0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
23fc0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
23fd0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
23fe0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
23ff0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
24000 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
24010 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
24020 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
24030 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
24040 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24050 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
24060 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
24070 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
24080 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
24090 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
240a0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
240b0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
240c0 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
240d0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
240e0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
240f0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
24100 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
24110 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
24120 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
24130 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
24140 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
24150 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
24160 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
24170 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
24180 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
24190 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
241a0 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
241b0 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
241c0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
241d0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
241e0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
241f0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
24200 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
24210 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
24220 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
24230 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
24240 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
24250 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
24260 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
24270 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
24280 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
24290 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
242a0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
242b0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
242c0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
242d0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
242e0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
242f0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
24300 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
24310 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
24320 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
24330 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
24340 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
24350 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
24360 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
24370 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
24380 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
24390 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
243a0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
243b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
243c0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
243d0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
243e0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
243f0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
24400 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
24410 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
24420 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
24430 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
24440 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
24450 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
24460 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
24470 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
24480 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
24490 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
244a0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
244b0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
244c0 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
244d0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
244e0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
244f0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
24500 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
24510 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24530 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
24540 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
24570 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
24580 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
24590 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
245c0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
245d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
245e0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
245f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24600 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
24610 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
24620 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
24630 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
24640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24650 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
24660 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
24670 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24680 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
24690 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
246a0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
246b0 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
246e0 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
246f0 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
24700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
24710 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
24720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
24730 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
24740 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
24750 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
24760 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
24770 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
24780 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
24790 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
247a0 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
247b0 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
247c0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
247d0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
247e0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
247f0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
24800 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
24810 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
24820 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
24830 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
24840 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
24850 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
24860 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
24870 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
24880 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24890 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
248a0 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
248b0 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
248c0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
248d0 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
248e0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
248f0 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
24900 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
24910 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
24920 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24930 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
24940 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
24950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
24960 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
24970 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
24980 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24990 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62  ag==0 || (pBt->b
249a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
249b0 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a  AD_ONLY)==0 );..
249c0 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
249d0 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
249e0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
249f0 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
24a00 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
24a10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
24a20 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
24a30 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
24a40 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
24a50 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
24a60 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
24a70 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
24a80 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
24a90 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
24aa0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
24ab0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
24ac0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
24ad0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
24ae0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
24af0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
24b00 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
24b10 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
24b20 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
24b30 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
24b40 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
24b50 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
24b60 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
24b70 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73  >pBt = pBt;.  as
24b80 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24b90 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f  || wrFlag==BTCF_
24ba0 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70  WriteFlag );.  p
24bb0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
24bc0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
24bd0 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20  curPagerFlags = 
24be0 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47  wrFlag ? 0 : PAG
24bf0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b  ER_GET_READONLY;
24c00 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
24c10 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  re two or more c
24c20 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61  ursors on the sa
24c30 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61  me btree, then a
24c40 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72  ll such.  ** cur
24c50 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65  sors *must* have
24c60 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
24c70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a  le flag set. */.
24c80 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43    for(pX=pBt->pC
24c90 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58  ursor; pX; pX=pX
24ca0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
24cb0 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  ( pX->pgnoRoot==
24cc0 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a  (Pgno)iTable ){.
24cd0 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61        pX->curFla
24ce0 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
24cf0 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ple;.      pCur-
24d00 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
24d10 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
24d20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e  }.  }.  pCur->pN
24d30 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
24d40 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  or;.  pBt->pCurs
24d50 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
24d60 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24d70 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
24d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24d90 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
24da0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
24db0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
24de0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
24df0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
24e20 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
24e30 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
24e40 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
24e70 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
24e80 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
24e90 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
24ec0 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
24ed0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f00 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
24f10 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
24f20 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62  t rc;.  if( iTab
24f30 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  le<1 ){.    rc =
24f40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24f50 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
24f60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
24f70 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
24f80 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
24f90 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
24fa0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
24fb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24fc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
24fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24fe0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24ff0 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
25000 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
25010 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
25020 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
25030 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
25040 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
25050 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
25060 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
25070 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
25080 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
25090 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
250a0 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
250b0 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
250c0 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
250d0 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
250e0 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
250f0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
25100 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25110 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
25120 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
25130 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
25140 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
25150 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
25160 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
25170 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
25180 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
25190 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
251a0 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
251b0 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
251c0 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
251d0 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
251e0 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
251f0 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
25200 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
25210 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
25220 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
25230 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
25240 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
25250 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
25260 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
25270 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
25280 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
25290 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
252a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
252b0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
252c0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
252d0 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
252e0 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
252f0 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
25300 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
25310 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
25320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25330 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
25340 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
25350 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
25360 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25370 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
25380 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25390 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
253a0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
253b0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
253c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
253d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
253e0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
253f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
25400 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
25410 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
25420 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
25430 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
25440 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
25450 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
25460 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  r==pCur ){.     
25470 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
25480 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
25490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74   }else{.      Bt
254a0 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20  Cursor *pPrev = 
254b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
254c0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
254d0 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  if( pPrev->pNext
254e0 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
254f0 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74      pPrev->pNext
25500 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
25510 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
25520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25530 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76     pPrev = pPrev
25540 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
25550 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50  while( ALWAYS(pP
25560 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  rev) );.    }.  
25570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
25580 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
25590 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
255a0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
255b0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
255c0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
255d0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
255e0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
255f0 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
25600 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
25610 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
25620 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25630 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
25640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
25660 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
25670 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
25680 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
25690 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
256a0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
256b0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
256c0 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
256d0 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
256e0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
256f0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
25700 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
25710 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
25720 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
25730 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
25740 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
25750 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
25760 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
25770 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
25780 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
25790 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
257a0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
257b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
257c0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
257d0 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
257e0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
257f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
25800 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
25810 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
25820 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
25830 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
25840 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
25850 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
25860 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
25870 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  || memcmp(&info,
25880 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
25890 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
258a0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
258b0 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
258c0 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
258d0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
258e0 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
258f0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
25900 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
25910 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
25920 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  0 ){.    int iPa
25930 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
25940 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  ;.    pCur->curF
25950 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
25960 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
25970 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
25980 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
25990 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
259a0 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  ],&pCur->info);.
259b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
259c0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
259d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
259e0 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
259f0 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
25a00 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
25a10 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
25a20 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
25a30 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
25a40 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
25a50 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
25a60 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
25a70 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
25a80 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
25a90 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
25aa0 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
25ab0 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
25ac0 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
25ad0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
25ae0 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
25af0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
25b00 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
25b10 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
25b20 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
25b30 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
25b40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25b50 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
25b60 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
25b70 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
25b80 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
25b90 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
25ba0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
25bb0 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
25bc0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
25bd0 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
25be0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
25bf0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
25c00 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
25c10 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
25c20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
25c30 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
25c40 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
25c50 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
25c60 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
25c70 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
25c80 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
25c90 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
25ca0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
25cb0 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
25cc0 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
25cd0 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
25ce0 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
25cf0 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
25d00 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
25d10 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
25d20 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
25d30 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
25d40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
25d50 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
25d60 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25d70 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25d80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25d90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25da0 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
25db0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
25dc0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
25dd0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72  fo.nKey;.  retur
25de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25df0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
25e00 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
25e10 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
25e20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
25e30 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
25e40 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
25e50 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
25e60 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
25e70 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
25e80 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
25e90 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
25ea0 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
25eb0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
25ec0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
25ed0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
25ee0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
25ef0 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
25f00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25f10 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
25f20 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
25f30 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
25f40 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
25f50 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
25f60 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
25f70 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
25f80 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
25f90 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
25fa0 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
25fb0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
25fc0 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
25fd0 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
25fe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25ff0 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
26000 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
26010 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
26020 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26030 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26040 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
26050 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26060 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
26070 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
26080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26090 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
260a0 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
260b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
260c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
260d0 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31  ]->intKeyLeaf==1
260e0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
260f0 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
26100 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
26110 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
26120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26130 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
26140 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
26150 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
26160 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
26170 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
26180 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
26190 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
261a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
261b0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
261c0 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
261d0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
261e0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
261f0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
26200 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
26210 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
26220 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
26230 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
26240 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
26250 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
26260 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
26270 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26280 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
26290 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
262a0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
262b0 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
262c0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
262d0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
262e0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
262f0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
26300 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
26310 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
26320 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
26330 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
26340 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
26350 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
26360 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
26370 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
26380 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
26390 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
263a0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
263b0 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
263c0 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
263d0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
263e0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
263f0 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
26400 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
26410 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
26420 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
26430 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
26440 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
26450 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
26460 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
26470 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
26480 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
26490 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
264a0 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
264b0 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
264c0 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
264d0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
264e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
264f0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
26500 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26520 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
26530 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
26540 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
26550 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
26560 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
26570 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
26580 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
26590 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
265a0 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
265b0 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
265c0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
265e0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
265f0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
26600 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
26610 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
26620 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
26630 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26640 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
26650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26660 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
26670 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
26680 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
26690 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
266a0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
266b0 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
266c0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
266d0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
266e0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
266f0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
26700 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
26710 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
26720 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
26730 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
26740 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
26750 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
26760 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
26770 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
26780 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
26790 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
267a0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
267b0 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
267c0 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
267d0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
267e0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
267f0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
26800 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
26810 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
26820 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
26830 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
26840 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
26850 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
26860 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26870 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
26880 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
26890 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
268a0 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
268b0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
268c0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
268d0 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
268e0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
268f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26900 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
26910 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
26920 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
26930 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
26940 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
26950 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
26960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26970 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
26980 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
26990 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
269a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
269b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
269c0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
269d0 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
269e0 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50   (ppPage==0) ? P
269f0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26a00 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  Y : 0);.    asse
26a10 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
26a20 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b  K || pPage==0 );
26a30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26a40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26a50 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
26a60 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
26a70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
26a80 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
26a90 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
26aa0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
26ab0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
26ac0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
26ad0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
26ae0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
26af0 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
26b00 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
26b10 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
26b20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
26b30 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
26b40 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
26b50 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
26b60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
26b70 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
26b80 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
26b90 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
26ba0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
26bb0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
26bc0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
26bd0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
26be0 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
26bf0 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
26c00 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
26c10 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
26c20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26c30 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
26c40 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
26c50 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
26c60 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
26c70 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
26c80 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
26c90 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
26ca0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
26cb0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
26cc0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
26cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
26ce0 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
26cf0 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
26d00 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
26d10 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
26d20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d40 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
26d50 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
26d60 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
26d70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26d80 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
26d90 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26db0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
26dc0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
26dd0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
26de0 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
26df0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
26e00 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
26e10 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
26e20 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
26e30 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
26e40 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
26e50 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
26e60 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
26e70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26e80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
26e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26ea0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
26eb0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
26ec0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
26ed0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
26ee0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
26ef0 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
26f00 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
26f10 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
26f20 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
26f30 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
26f40 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
26f50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
26f60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26f70 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
26f80 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
26f90 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
26fa0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
26fb0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
26fc0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
26fd0 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f  nting to. The eO
26fe0 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  p.** argument is
26ff0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
27000 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
27010 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   0: The operatio
27020 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70  n is a read. Pop
27030 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
27040 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31  ow cache..**   1
27050 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
27060 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75  is a write. Popu
27070 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
27080 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a  w cache..**   2:
27090 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
270a0 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74  s a read. Do not
270b0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
270c0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
270d0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
270e0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
270f0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
27100 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
27110 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
27120 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
27130 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
27140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
27150 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
27160 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
27170 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
27180 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
27190 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
271a0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
271b0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
271c0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
271d0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
271e0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
271f0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64  erflow pages and
27200 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75   the.** eOp argu
27210 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74  ment is not 2, t
27220 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
27230 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
27240 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a  for and lazily .
27250 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65  ** populates the
27260 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
27270 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20  ist cache array 
27280 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
27290 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71  low). .** Subseq
272a0 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
272b0 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  his cache to mak
272c0 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
272d0 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
272e0 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69   .** more effici
272f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
27300 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27310 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
27320 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
27330 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
27340 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
27350 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
27360 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
27370 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
27380 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
27390 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
273a0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
273b0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
273c0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
273d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
273e0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
273f0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
27400 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
27410 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
27420 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
27430 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
27440 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
27450 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
27460 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
27470 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
27480 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
27490 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
274a0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
274b0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
274c0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
274d0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
274e0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
274f0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
27500 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
27510 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
27520 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
27530 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
27540 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
27550 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
27560 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
27570 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27580 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
27590 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
275a0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
275b0 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
275c0 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
275d0 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
275e0 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
275f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27600 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
27610 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27620 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
27630 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27640 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27650 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
27660 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
27670 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
27680 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
27690 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
276b0 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
276c0 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
276d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
276e0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
276f0 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  EAD.  unsigned c
27700 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66  har * const pBuf
27710 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
27720 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20  int bEnd;       
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27750 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20  e if reading to 
27760 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23  end of data */.#
27770 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
27780 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
27790 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
277a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
277b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
277c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
277d0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
277e0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
277f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27800 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27810 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66  t( eOp!=2 || off
27820 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
27830 41 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f  Always start fro
27840 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20  m beginning for 
27850 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74  eOp==2 */..  get
27860 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
27870 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
27880 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27890 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
278a0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
278b0 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66  READ.  bEnd = of
278c0 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e  fset+amt==pCur->
278d0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23  info.nPayload;.#
278e0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
278f0 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43  offset+amt <= pC
27900 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
27910 64 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61  d );..  if( &aPa
27920 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
27930 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
27940 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
27950 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ableSize] ){.   
27960 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
27970 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
27980 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27990 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
279a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
279b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
279c0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
279d0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
279e0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
279f0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
27a00 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
27a10 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
27a20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27a30 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
27a40 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
27a50 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
27a60 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
27a70 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
27a80 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
27a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
27aa0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
27ab0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
27ac0 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20  pBuf, a, (eOp & 
27ad0 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44  0x01), pPage->pD
27ae0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
27af0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
27b00 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
27b10 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
27b20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
27b30 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
27b40 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
27b50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
27b60 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
27b70 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
27b80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
27b90 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
27ba0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
27bb0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
27bc0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
27bd0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
27be0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
27bf0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
27c00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
27c10 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
27c20 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
27c30 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
27c40 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
27c50 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
27c60 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76  not allocate aOv
27c70 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70  erflow[] for eOp
27c80 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ==2..    **.    
27c90 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
27ca0 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
27cb0 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
27cc0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
27cd0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
27ce0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
27cf0 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
27d00 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
27d10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
27d20 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
27d30 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
27d40 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
27d50 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
27d60 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
27d70 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
27d80 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
27d90 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
27da0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
27db0 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20  .    if( eOp!=2 
27dc0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
27dd0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
27de0 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
27df0 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
27e00 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
27e10 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
27e20 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
27e30 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
27e40 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e  if( nOvfl>pCur->
27e50 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  nOvflAlloc ){.  
27e60 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
27e70 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
27e80 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
27e90 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
27ea0 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
27eb0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
27ec0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
27ed0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
27ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27ef0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
27f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27f10 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
27f20 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
27f30 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
27f40 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
27f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27f60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
27f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27f80 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
27f90 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
27fa0 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
27fb0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gno));.        p
27fc0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
27fd0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
27fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
27ff0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
28000 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
28010 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
28020 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
28030 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
28040 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
28050 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
28060 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
28070 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
28080 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
28090 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
280a0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
280b0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20  ValidOvfl)!=0.  
280c0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65     && pCur->aOve
280d0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
280e0 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20  lSize].    ){.  
280f0 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
28100 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
28110 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
28120 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28130 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
28140 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
28150 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  lSize);.    }.. 
28160 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
28170 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
28180 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
28190 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a  dx++){..      /*
281a0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
281b0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
281c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
281d0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
281e0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
281f0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
28200 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)!=0 ){.      
28210 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
28220 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
28230 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
28240 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
28250 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
28260 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28270 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
28280 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
28290 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
282a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
282b0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
282c0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
282d0 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
282e0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
282f0 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
28300 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
28310 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
28320 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
28330 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
28340 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
28350 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
28360 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
28370 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
28380 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
28390 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
283a0 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
283b0 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
283c0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
283d0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
283e0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
283f0 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  at the aOverflow
28400 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65  [] array must be
28410 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75   allocated becau
28420 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20  se eOp!=2.      
28430 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65    ** here.  If e
28440 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73  Op==2, then offs
28450 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62  et==0 and this b
28460 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74  ranch is never t
28470 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aken..        */
28480 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28490 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20   eOp!=2 );.     
284a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
284b0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
284c0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
284d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
284e0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
284f0 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
28500 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
28510 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
28520 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
28530 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
28540 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
28550 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28560 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
28570 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
28580 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
28590 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
285a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
285b0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
285c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
285d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
285e0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
285f0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
28600 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
28610 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
28620 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
28630 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
28640 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
28650 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
28660 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
28670 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
28680 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
28690 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
286a0 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
286b0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
286c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
286d0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
286e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
286f0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
28700 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
28710 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
28720 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
28730 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
28740 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
28750 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
28760 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28770 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
28780 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
28790 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
287a0 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
287b0 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
287c0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
287d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
287e0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
287f0 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
28800 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
28810 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
28820 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
28830 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
28840 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
28850 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
28860 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
28870 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
28880 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
28890 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
288a0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
288b0 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a   read..        *
288c0 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20  *   7) at least 
288d0 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
288e0 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
288f0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
28900 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
28910 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
28920 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
28930 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
28940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28950 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
28960 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
28970 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
28980 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
28990 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
289a0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
289b0 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
289c0 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
289d0 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
289e0 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
289f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
28a00 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20   (eOp&0x01)==0  
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
28a40 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
28a50 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a80 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
28a90 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f  && (bEnd || a==o
28aa0 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20  vflSize)        
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
28ad0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
28ae0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
28af0 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20  TRANS_READ      
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28b10 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
28b20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74    && (fd = sqlit
28b30 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
28b40 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68  >pPager))->pMeth
28b50 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a  ods     /* (3) *
28b60 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
28b70 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
28b80 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20  [19]==0x01      
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20   /* (5) */.     
28bb0 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
28bc0 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29            /* (7)
28bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
28c00 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
28c10 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
28c20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
28c30 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
28c40 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
28c50 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20         /* hence 
28c80 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (7) */.         
28c90 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
28ca0 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
28cb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28cc0 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
28cd0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
28ce0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
28cf0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
28d00 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
28d10 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
28d20 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
28d30 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
28d40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
28d50 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
28d60 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
28d70 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
28d80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28d90 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
28da0 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
28db0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
28dc0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
28dd0 20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d     ((eOp&0x01)==
28de0 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
28df0 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
28e00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28e10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28e30 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
28e40 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
28e50 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
28e60 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
28e70 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
28e80 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
28e90 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
28ea0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
28eb0 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
28ec0 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70  a, (eOp&0x01), p
28ed0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28ee0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
28ef0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
28f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
28f10 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
28f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28f30 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
28f40 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
28f50 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
28f60 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
28f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
28f80 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
28f90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28fa0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
28fb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28fc0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
28fd0 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
28fe0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
28ff0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
29000 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
29010 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69  be transferred i
29020 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
29030 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
29040 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
29050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
29060 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
29070 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
29080 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
29090 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
290a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
290b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
290c0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
290d0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
290e0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
290f0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
29100 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
29110 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
29120 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
29130 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
29140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29150 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
29160 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
29170 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
29180 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
29190 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
291a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
291b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
291c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
291d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
291e0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
291f0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
29200 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
29210 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29220 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29230 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
29240 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
29250 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
29260 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
29270 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
29280 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
29290 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
292a0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
292b0 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
292c0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
292d0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
292e0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
292f0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
29300 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
29310 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
29320 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
29330 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
29340 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
29350 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
29360 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
29370 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
29380 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
29390 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
293a0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
293b0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
293c0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
293d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
293e0 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
293f0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
29400 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
29410 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
29420 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
29430 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
29440 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
29450 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
29460 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
29470 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
29480 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
29490 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
294a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
294b0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
294c0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
294d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
294e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
294f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29500 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29510 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
29520 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
29530 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
29540 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
29550 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
29560 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29570 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
29580 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29590 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
295a0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
295b0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
295c0 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
295d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
295e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
295f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
29600 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
29610 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
29620 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
29630 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
29640 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
29650 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
29660 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
29670 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
29680 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
29690 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
296a0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
296b0 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
296c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
296d0 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
296e0 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
296f0 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
29700 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29710 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
29720 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
29730 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
29740 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
29750 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
29760 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29770 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
29780 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
29790 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
297a0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
297b0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
297c0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
297d0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
297e0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
297f0 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
29800 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
29810 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
29820 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
29830 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
29840 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
29850 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
29860 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
29870 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
29880 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
29890 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
298a0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
298b0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
298c0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
298d0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
298e0 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
298f0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
29900 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
29910 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
29920 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
29930 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
29940 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
29950 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
29960 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
29970 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
29980 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
29990 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
299a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
299b0 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
299c0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
299d0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
299e0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
299f0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
29a00 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
29a10 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
29a20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
29a30 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
29a40 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
29a50 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20  ){.  u32 amt;.  
29a60 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
29a70 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
29a80 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
29a90 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
29aa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29ab0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29ac0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
29ad0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29ae0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
29af0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
29b00 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
29b10 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
29b20 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29b30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29b40 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
29b50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29b60 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  e]->nCell );.  a
29b70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29b80 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61  o.nSize>0 );.  a
29b90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29ba0 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d  o.pPayload>pCur-
29bb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29bc0 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43  age]->aData || C
29bd0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
29be0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29bf0 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
29c00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29c10 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c  age]->aDataEnd |
29c20 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20  |CORRUPT_DB);.  
29c30 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72  amt = (int)(pCur
29c40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29c50 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20  Page]->aDataEnd 
29c60 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  - pCur->info.pPa
29c70 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43  yload);.  if( pC
29c80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  ur->info.nLocal<
29c90 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72  amt ) amt = pCur
29ca0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
29cb0 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20   *pAmt = amt;.  
29cc0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
29cd0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
29ce0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
29cf0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
29d00 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
29d10 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
29d20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
29d30 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
29d40 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
29d50 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
29d60 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
29d70 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
29d80 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
29d90 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
29da0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
29db0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
29dc0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
29dd0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
29de0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
29df0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
29e00 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
29e10 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
29e20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
29e30 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
29e40 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
29e50 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
29e60 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
29e70 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
29e80 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
29e90 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
29ea0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
29eb0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
29ec0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
29ed0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
29ee0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
29ef0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
29f00 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
29f10 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
29f20 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
29f30 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
29f40 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
29f50 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
29f60 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
29f70 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
29f80 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73  r, pAmt);.}.cons
29f90 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
29fa0 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
29fb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
29fc0 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
29fd0 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
29fe0 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
29ff0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2a000 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
2a010 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
2a020 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
2a030 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
2a040 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2a050 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
2a060 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
2a070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
2a080 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
2a090 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
2a0a0 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
2a0b0 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
2a0c0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
2a0d0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
2a0e0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
2a0f0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
2a100 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
2a110 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
2a120 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
2a130 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
2a140 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
2a150 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
2a160 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
2a170 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
2a180 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
2a190 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2a1a0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
2a1b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2a1c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2a1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a1e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a1f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2a200 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
2a210 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
2a220 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
2a230 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2a240 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
2a250 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
2a260 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
2a270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a280 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2a290 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   }.  pCur->info.
2a2a0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a2b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a2c0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2a2d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2a2e0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
2a2f0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
2a300 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30  pCur->iPage] = 0
2a310 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e  ;.  return getAn
2a320 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
2a330 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61  ewPgno, &pCur->a
2a340 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a350 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
2a360 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2a370 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
2a380 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53  Flags);.}..#if S
2a390 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2a3a0 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
2a3b0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
2a3c0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
2a3d0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
2a3e0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
2a3f0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
2a400 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
2a410 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
2a420 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
2a430 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
2a440 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
2a450 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
2a460 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
2a470 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
2a480 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2a490 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2a4a0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
2a4b0 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
2a4c0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
2a4d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
2a4e0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
2a4f0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
2a500 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
2a510 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
2a520 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
2a530 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
2a540 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
2a550 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
2a580 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
2a590 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
2a5a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
2a5b0 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
2a5c0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2a5d0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2a5e0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2a5f0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2a600 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
2a610 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a620 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2a630 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
2a640 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
2a650 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
2a660 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
2a670 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
2a680 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
2a690 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2a6a0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
2a6b0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
2a6c0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2a6d0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
2a6e0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
2a6f0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
2a700 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
2a710 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
2a720 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
2a730 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
2a740 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
2a750 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
2a760 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
2a770 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
2a780 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
2a790 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
2a7a0 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
2a7b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a7c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2a7d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2a7e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a7f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a800 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a810 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a820 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
2a830 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2a840 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
2a850 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
2a860 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
2a870 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a880 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
2a890 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a8a0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
2a8b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a8c0 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
2a8d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  ;.  testcase( pC
2a8e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a8f0 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
2a900 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a910 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
2a920 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2a930 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2a940 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2a950 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2a960 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2a970 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2a980 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
2a990 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
2a9a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2a9b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
2a9c0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
2a9d0 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
2a9e0 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
2a9f0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
2aa00 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
2aa10 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
2aa20 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
2aa30 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
2aa40 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
2aa50 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
2aa60 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
2aa70 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
2aa80 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
2aa90 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
2aaa0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2aab0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2aac0 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
2aad0 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
2aae0 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
2aaf0 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
2ab00 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2ab10 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
2ab20 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
2ab30 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
2ab40 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
2ab50 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
2ab60 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
2ab70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
2ab80 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
2ab90 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
2aba0 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
2abb0 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
2abc0 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
2abd0 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
2abe0 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
2abf0 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
2ac00 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
2ac10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2ac20 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
2ac30 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
2ac40 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
2ac50 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
2ac60 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
2ac70 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
2ac80 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
2ac90 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
2aca0 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
2acb0 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
2acc0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
2acd0 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
2ace0 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
2acf0 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
2ad00 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
2ad10 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
2ad20 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
2ad30 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
2ad40 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
2ad50 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
2ad60 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
2ad70 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
2ad80 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
2ad90 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
2ada0 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
2adb0 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
2adc0 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
2add0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
2ade0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2adf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
2ae00 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
2ae10 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2ae20 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2ae30 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2ae40 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
2ae50 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
2ae60 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
2ae70 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2ae80 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
2ae90 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2aea0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2aeb0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
2aec0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2aed0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2aee0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
2aef0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
2af00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2af10 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2af20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2af30 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
2af40 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2af50 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2af60 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
2af70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
2af80 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2af90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
2afa0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
2afb0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2afc0 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61  iPage ){.      a
2afd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2afe0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2aff0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c  !=0 );.      rel
2b000 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
2b010 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b020 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
2b030 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2b040 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2b050 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
2b060 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2b070 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75  NVALID;.    retu
2b080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b090 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2b0a0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
2b0b0 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  (-1) );.    rc =
2b0c0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2b0d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2b0e0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2b0f0 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
2b100 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
2b120 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
2b130 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
2b140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b150 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2b160 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2b170 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
2b180 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2b190 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
2b1a0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74      pCur->curInt
2b1b0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  Key = pCur->apPa
2b1c0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20  ge[0]->intKey;. 
2b1d0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
2b1e0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
2b1f0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
2b200 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
2b210 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  oot );..  /* If 
2b220 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
2b230 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2b240 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
2b250 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
2b260 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65  sor.  ** expecte
2b270 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
2b280 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
2b290 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
2b2a0 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20  KeyInfo is.  ** 
2b2b0 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
2b2c0 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
2b2d0 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
2b2e0 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
2b2f0 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e  ,.  ** return an
2b300 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2b310 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a  error. .  **.  *
2b320 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  * Earlier versio
2b330 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73  ns of SQLite ass
2b340 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74  umed that this t
2b350 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61  est could not fa
2b360 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72  il.  ** if the r
2b370 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72  oot page was alr
2b380 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e  eady loaded when
2b390 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2b3a0 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a  as called (i.e..
2b3b0 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50    ** if pCur->iP
2b3c0 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69  age>=0). But thi
2b3d0 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74  s is not so if t
2b3e0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2b3f0 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69  orrupted .  ** i
2b400 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
2b410 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20  t page pRoot is 
2b420 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65  linked into a se
2b430 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c  cond b-tree tabl
2b440 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20  e .  ** (or the 
2b450 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20  freelist).  */. 
2b460 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
2b470 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f  intKey==1 || pRo
2b480 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  ot->intKey==0 );
2b490 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73  .  if( pRoot->is
2b4a0 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Init==0 || (pCur
2b4b0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d  ->pKeyInfo==0)!=
2b4c0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b  pRoot->intKey ){
2b4d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b4e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b4f0 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69  .  }..  pCur->ai
2b500 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
2b510 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2b520 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2b530 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2b540 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2b550 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2b560 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f  vfl);..  if( pRo
2b570 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
2b580 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b590 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2b5a0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
2b5b0 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
2b5c0 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
2b5d0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
2b5e0 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
2b5f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b600 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
2b610 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
2b620 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
2b630 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2b640 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b650 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2b660 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b670 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
2b680 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2b690 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2b6a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2b6b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2b6d0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2b6e0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
2b6f0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2b700 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
2b710 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2b720 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2b730 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
2b740 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
2b750 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2b760 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
2b770 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
2b780 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2b790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b7a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
2b7b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b7c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2b7d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b7e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b7f0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b800 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2b810 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b820 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b830 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b840 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2b850 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
2b860 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2b870 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
2b880 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
2b890 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2b8a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
2b8b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2b8c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2b8d0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2b8e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b8f0 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
2b900 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2b910 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2b920 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b930 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2b940 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
2b950 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2b960 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2b970 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
2b980 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
2b990 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2b9a0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
2b9b0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
2b9c0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
2b9d0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
2b9e0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
2b9f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
2ba00 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
2ba10 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2ba20 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
2ba30 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
2ba40 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
2ba50 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2ba60 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2ba70 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
2ba80 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
2ba90 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
2baa0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2bab0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
2bac0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
2bad0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
2bae0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
2baf0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
2bb00 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2bb10 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2bb20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2bb30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2bb40 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2bb50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2bb60 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2bb70 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2bb80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2bb90 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
2bba0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2bbb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
2bbc0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2bbd0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2bbe0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2bbf0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2bc00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2bc10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
2bc20 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2bc30 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2bc40 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2bc50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2bc60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
2bc70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2bc80 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
2bc90 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
2bca0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2bcb0 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
2bcc0 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2bcd0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2bce0 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
2bcf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2bd00 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2bd10 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
2bd20 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2bd30 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2bd40 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2bd50 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2bd60 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2bd70 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2bd80 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2bd90 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2bda0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2bdb0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2bdc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2bdd0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
2bde0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2bdf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2be00 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2be10 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2be20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2be30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2be40 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2be50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2be60 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2be70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2be80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2be90 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2bea0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2beb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2bec0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2bed0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2bee0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2bef0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2bf00 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2bf10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2bf20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2bf30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bf40 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2bf50 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2bf60 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2bf70 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2bf80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2bf90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2bfa0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2bfb0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2bfc0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2bfd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2bfe0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2bff0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2c000 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2c010 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2c020 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2c030 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2c040 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2c050 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2c060 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2c070 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c080 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2c090 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2c0a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2c0b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2c0c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c0d0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2c0e0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2c0f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2c100 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
2c110 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
2c120 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
2c130 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
2c140 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2c150 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
2c160 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c170 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2c180 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2c190 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
2c1a0 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
2c1b0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
2c1c0 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
2c1d0 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
2c1e0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
2c1f0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2c200 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
2c210 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
2c220 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
2c230 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
2c240 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c250 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
2c260 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
2c270 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
2c280 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2c290 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c2a0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
2c2b0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2c2c0 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
2c2d0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2c2e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
2c2f0 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
2c300 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c310 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
2c320 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2c330 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2c340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2c350 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2c360 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2c370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c380 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2c390 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2c3a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2c3b0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
2c3c0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2c3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2c3e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c3f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c400 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2c410 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
2c420 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2c430 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
2c440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c450 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
2c460 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2c470 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65  AtLast;.      }e
2c480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75  lse{.        pCu
2c490 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2c4a0 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2c4b0 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20     }.   .    }. 
2c4c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c4d0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2c4e0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
2c4f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
2c500 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
2c510 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
2c520 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
2c530 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
2c540 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
2c550 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
2c560 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
2c570 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
2c580 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
2c590 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
2c5a0 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2c5b0 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
2c5c0 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
2c5d0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
2c5e0 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
2c5f0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
2c600 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
2c610 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
2c620 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2c630 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
2c640 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
2c650 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
2c660 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
2c670 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
2c680 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
2c690 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
2c6a0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
2c6b0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
2c6c0 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
2c6d0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
2c6e0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
2c6f0 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
2c700 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
2c710 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
2c720 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
2c730 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
2c740 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
2c750 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
2c760 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
2c770 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
2c780 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
2c790 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
2c7a0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2c7b0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2c7c0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2c7d0 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
2c7e0 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
2c7f0 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
2c800 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2c810 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
2c820 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
2c830 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
2c840 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
2c850 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
2c860 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
2c870 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2c880 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2c890 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8b0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2c8c0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2c8d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2c8e0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
2c8f0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2c900 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2c910 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2c920 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
2c930 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2c940 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
2c950 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
2c960 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
2c970 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2c980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c990 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
2c9a0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
2c9b0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
2c9c0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
2c9d0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
2c9e0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
2c9f0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2ca00 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
2ca10 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
2ca20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2ca30 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
2ca40 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
2ca50 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca70 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
2ca80 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
2ca90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
2caa0 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
2cab0 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
2cac0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2cad0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2cae0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2caf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2cb00 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2cb10 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2cb20 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2cb30 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2cb40 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2cb50 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
2cb60 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
2cb70 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
2cb80 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
2cb90 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
2cba0 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
2cbb0 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
2cbc0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2cbd0 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
2cbe0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2cbf0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2cc00 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2cc10 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2cc20 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  !=0.   && pCur->
2cc30 63 75 72 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  curIntKey .  ){.
2cc40 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2cc50 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2cc60 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2cc70 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2cc80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2cc90 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
2cca0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2ccb0 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
2ccc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2ccd0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2cce0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2ccf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cd00 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
2cd10 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2cd20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2cd30 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2cd40 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2cd50 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2cd60 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2cd70 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2cd80 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2cd90 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2cda0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2cdb0 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2cdc0 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2cdd0 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2cde0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2cdf0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2ce00 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2ce10 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2ce20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2ce30 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2ce40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2ce50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2ce60 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2ce70 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2ce80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ce90 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2cea0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2ceb0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2cec0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ced0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2cee0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2cef0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2cf00 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2cf10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2cf20 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2cf30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2cf40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2cf50 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2cf60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2cf70 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2cf80 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2cf90 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2cfa0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2cfb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cfc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2cfd0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2cfe0 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2cff0 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2d000 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2d010 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2d020 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2d030 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2d040 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2d050 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2d060 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2d070 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d080 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2d090 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2d0c0 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2d0d0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2d0e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2d0f0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2d100 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2d110 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2d120 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2d130 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2d140 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2d150 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2d160 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2d170 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2d180 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2d190 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2d1a0 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2d1b0 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2d1c0 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2d1d0 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2d1e0 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2d1f0 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2d200 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2d210 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2d220 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2d230 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2d240 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2d250 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2d260 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2d270 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2d280 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2d290 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d2a0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2d2b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d2c0 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2d2d0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2d2e0 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2d2f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2d300 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2d310 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2d320 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2d330 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2d340 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2d350 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2d360 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2d370 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
2d380 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d390 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2d3a0 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2d3b0 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2d3c0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2d3d0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2d3e0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2d3f0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2d400 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2d410 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2d420 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2d430 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2d440 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2d450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d460 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2d470 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
2d480 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2d490 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2d4a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d4b0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2d4c0 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2d4d0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2d4e0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2d4f0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d500 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2d510 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2d520 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2d530 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2d540 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2d550 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2d560 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2d570 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2d580 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2d590 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2d5a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d5b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d5c0 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2d5d0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2d5e0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2d5f0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2d600 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2d610 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2d620 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2d630 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2d640 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2d650 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2d660 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2d670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d680 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2d690 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2d6a0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2d6b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2d6d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2d6e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d6f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
2d700 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2d710 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2d720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d730 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2d740 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2d750 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2d760 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2d770 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2d780 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2d790 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2d7a0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2d7b0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2d7c0 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2d7d0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2d7e0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2d7f0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2d800 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2d810 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2d820 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2d830 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2d840 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2d850 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2d860 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2d870 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2d880 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2d890 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2d8a0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2d8b0 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2d8c0 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2d8d0 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2d8e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2d8f0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2d900 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2d910 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2d920 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2d930 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2d940 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2d950 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2d960 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2d970 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2d980 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2d990 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2d9a0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2d9b0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2d9c0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2d9d0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2d9e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d9f0 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2da00 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2da10 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2da20 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2da30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2da40 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2da50 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2da60 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2da70 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2da80 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2da90 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2daa0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2dab0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2dac0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2dad0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2dae0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2daf0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2db00 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2db10 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2db20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2db30 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2db40 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2db50 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2db60 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2db70 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2db80 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2db90 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2dba0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2dbb0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2dbc0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2dbd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2dbe0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2dbf0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2dc00 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2dc10 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2dc20 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2dc30 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2dc40 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2dc50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2dc60 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2dc70 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2dc80 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2dc90 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2dca0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2dcb0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2dcc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2dce0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2dcf0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2dd00 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2dd10 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2dd20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2dd30 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2dd40 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2dd50 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2dd60 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2dd70 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2dd80 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2dd90 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2dda0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2ddb0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2ddc0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2ddd0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2dde0 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2ddf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2de00 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2de10 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2de20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2de30 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2de40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2de50 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2de60 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2de70 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2de80 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2de90 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2dea0 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2deb0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2dec0 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2ded0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2dee0 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2def0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2df00 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2df10 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2df20 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2df30 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2df40 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2df50 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2df60 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2df70 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2df80 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2df90 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2dfa0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2dfb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2dfc0 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2dfd0 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2dfe0 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2dff0 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2e000 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2e010 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2e020 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2e030 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2e040 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e050 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2e060 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2e070 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2e080 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2e090 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2e0a0 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2e0b0 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2e0c0 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2e0d0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2e0e0 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2e0f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2e100 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e110 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2e120 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2e130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e140 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2e150 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2e160 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2e170 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2e180 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e1a0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
2e1b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2e1c0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2e1d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2e1e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e1f0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2e200 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2e210 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2e220 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2e230 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2e240 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20  lKey, 2);.      
2e250 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e270 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2e280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2e290 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2e2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e2b0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2e2c0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2e2d0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
2e2e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2e2f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2e300 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2e310 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2e320 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
2e330 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2e340 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
2e350 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
2e360 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
2e370 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2e380 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
2e390 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
2e3a0 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
2e3b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2e3c0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
2e3d0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2e3e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e3f0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
2e400 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2e410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e420 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2e430 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2e440 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2e450 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e460 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2e470 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2e480 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2e490 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2e4a0 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
2e4b0 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
2e4c0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
2e4d0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2e4e0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2e4f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
2e500 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
2e510 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e520 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2e530 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2e540 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2e550 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
2e560 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2e570 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
2e580 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
2e590 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2e5a0 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
2e5b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e5c0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
2e5d0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2e5e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2e5f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2e600 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
2e610 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e620 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
2e630 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2e640 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2e650 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
2e660 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
2e670 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2e680 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2e690 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
2e6a0 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2e6b0 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
2e6c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2e6d0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2e6e0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2e6f0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2e700 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
2e710 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
2e720 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
2e730 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
2e740 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
2e750 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e760 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
2e770 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
2e780 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
2e790 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
2e7a0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
2e7b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
2e7c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e7d0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2e7e0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2e7f0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2e800 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
2e810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2e820 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2e830 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2e840 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2e850 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2e860 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2e870 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2e880 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2e890 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2e8a0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2e8b0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2e8c0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2e8d0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2e8e0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2e8f0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2e900 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2e910 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2e920 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2e930 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2e940 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2e950 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2e960 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2e970 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2e980 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2e990 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2e9a0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2e9b0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2e9c0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2e9d0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2e9e0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2e9f0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2ea00 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2ea10 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2ea20 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2ea30 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2ea40 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2ea50 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2ea60 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2ea70 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2ea80 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
2ea90 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
2eaa0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
2eab0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
2eac0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
2ead0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
2eae0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2eaf0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
2eb00 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
2eb10 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
2eb20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
2eb30 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2eb40 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2eb50 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2eb60 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2eb70 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2eb80 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2eb90 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2eba0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2ebb0 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2ebc0 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2ebd0 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2ebe0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2ebf0 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2ec00 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2ec10 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2ec20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2ec30 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2ec40 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2ec50 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2ec60 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2ec70 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2ec80 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2ec90 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2eca0 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2ecb0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2ecc0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2ecd0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2ece0 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2ecf0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2ed00 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2ed10 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2ed20 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2ed30 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2ed40 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2ed50 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2ed60 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2ed70 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2ed80 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2ed90 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2eda0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2edb0 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2edc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2edd0 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2ede0 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2edf0 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2ee00 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2ee10 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2ee20 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2ee30 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2ee40 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2ee50 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2ee60 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2ee70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ee80 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2ee90 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2eea0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2eeb0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2eec0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2eed0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2eee0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2eef0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2ef00 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2ef10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2ef20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2ef30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2ef40 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2ef50 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2ef60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2ef70 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2ef80 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2ef90 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2efa0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2efb0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2efc0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2efd0 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2efe0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2eff0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2f000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2f020 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2f030 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2f040 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2f050 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2f060 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2f070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2f090 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2f0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2f0b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2f0c0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2f0d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2f0e0 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2f0f0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f100 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2f110 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2f120 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2f130 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2f140 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2f150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f160 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2f170 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2f180 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2f190 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2f1a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2f1b0 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2f1c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2f1d0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2f1e0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2f1f0 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2f200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f210 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2f220 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2f230 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2f240 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2f250 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2f260 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2f270 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2f280 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2f290 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2f2a0 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2f2b0 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2f2c0 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2f2d0 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2f2e0 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2f2f0 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2f300 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2f310 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2f320 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2f330 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2f340 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2f350 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2f360 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2f370 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2f380 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2f390 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2f3a0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2f3b0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2f3c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2f3d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2f3e0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2f3f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f400 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2f410 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2f420 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2f430 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2f440 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2f450 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2f460 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2f470 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2f480 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2f490 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f4a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2f4b0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2f4c0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2f4d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2f4e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f4f0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2f500 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2f510 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2f520 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2f530 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2f540 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2f550 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2f560 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2f570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2f580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f590 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2f5a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f5b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f5c0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2f5d0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2f5e0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2f5f0 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2f600 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2f610 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2f620 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2f630 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2f640 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2f650 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2f660 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2f670 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2f680 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
2f690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2f6a0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2f6b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2f6c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2f6d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2f6e0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2f6f0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2f700 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2f710 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a  _ValidOvfl);.  *
2f720 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
2f730 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2f740 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
2f750 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2f760 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61  ur, pRes);.  pPa
2f770 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2f780 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2f790 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61    if( (++pCur->a
2f7a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2f7b0 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])>=pPage->nCell
2f7c0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
2f7d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2f7e0 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  --;.    return b
2f7f0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2f800 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Res);.  }.  if( 
2f810 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f830 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2f840 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2f850 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2f860 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70   }.}../*.** Step
2f870 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2f880 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
2f890 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
2f8a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2f8b0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2f8c0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2f8d0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2f8e0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2f8f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2f900 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2f910 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2f920 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2f930 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2f940 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2f950 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2f960 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2f970 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2f980 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
2f990 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2f9a0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2f9b0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2f9c0 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
2f9d0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2f9e0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2f9f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
2fa00 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
2fa10 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2fa20 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2fa30 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
2fa40 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
2fa50 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2fa60 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2fa70 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2fa80 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
2fa90 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2faa0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
2fab0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2fac0 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
2fad0 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
2fae0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2faf0 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
2fb00 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
2fb10 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
2fb20 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2fb30 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
2fb40 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2fb50 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
2fb60 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
2fb70 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2fb80 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
2fb90 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
2fba0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
2fbb0 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
2fbc0 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
2fbd0 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
2fbe0 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
2fbf0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
2fc00 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
2fc10 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
2fc20 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
2fc30 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
2fc40 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
2fc50 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
2fc60 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2fc70 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2fc80 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
2fc90 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
2fca0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2fcb0 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
2fcc0 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
2fcd0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2fce0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2fcf0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2fd00 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2fd10 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2fd20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2fd30 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2fd40 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2fd50 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2fd60 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2fd70 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2fd80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2fd90 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2fda0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2fdb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2fdc0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2fdd0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2fde0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2fdf0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2fe00 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
2fe10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2fe20 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2fe30 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2fe40 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2fe50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
2fe60 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2fe70 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2fe80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fe90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fea0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2feb0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2fec0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2fed0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2fee0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2fef0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2ff00 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2ff10 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2ff20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2ff30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2ff40 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2ff50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2ff60 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2ff70 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2ff80 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2ff90 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2ffa0 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
2ffb0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2ffc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2ffd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ffe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2fff0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
30000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
30010 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
30020 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
30030 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30040 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
30050 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
30060 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
30070 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
30080 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
30090 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
300a0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
300b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
300c0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
300d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
300e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
300f0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
30100 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
30110 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
30120 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
30130 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
30140 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
30150 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
30160 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
30170 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
30180 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
30190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
301a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
301b0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
301c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
301d0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
301e0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
301f0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
30200 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
30210 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
30220 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
30230 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
30240 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
30250 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
30260 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
30270 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
30280 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
30290 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
302a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
302b0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
302c0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
302d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
302e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
302f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
30300 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
30310 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
30320 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
30330 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
30340 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
30350 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
30360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
30370 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
30380 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
30390 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
303a0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
303b0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
303c0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
303d0 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  ID );.  *pRes = 
303e0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
303f0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
30400 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
30410 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
30420 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
30430 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
30440 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
30450 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
30460 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b   || pCur->aiIdx[
30470 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a  pCur->iPage]==0.
30480 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61     || pCur->apPa
30490 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
304a0 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
304b0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
304c0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
304d0 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  s);.  }.  pCur->
304e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
304f0 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  e]--;.  return S
30500 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
30510 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
30520 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
30530 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
30540 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
30550 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
30560 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
30570 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
30580 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
30590 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
305a0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
305b0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
305c0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
305d0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
305e0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
305f0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
30600 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
30610 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
30620 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
30630 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
30640 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
30650 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
30660 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
30670 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
30680 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
30690 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
306a0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73  ror.  *ppPage is
306b0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
306c0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
306d0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
306e0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
306f0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
30700 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
30710 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
30720 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
30730 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
30740 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
30750 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
30760 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
30770 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
30780 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
30790 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
307a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
307b0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
307c0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
307d0 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
307e0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
307f0 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
30800 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
30810 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
30820 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
30830 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
30840 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
30850 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
30860 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
30870 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
30880 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
30890 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
308a0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
308b0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
308c0 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
308d0 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
308e0 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
308f0 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
30900 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
30910 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
30920 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
30930 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
30940 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
30950 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
30960 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
30970 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
30980 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
30990 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
309a0 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
309b0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
309c0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
309d0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
309e0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
309f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
30a00 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
30a10 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
30a20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
30a30 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
30a40 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
30a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30a60 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
30a70 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
30a80 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
30a90 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
30aa0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
30ab0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
30ac0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
30ad0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
30ae0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
30af0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
30b00 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
30b10 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
30b20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
30b30 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
30b40 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
30b50 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
30b60 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
30b70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
30b80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
30b90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30ba0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
30bb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
30bc0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
30bd0 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
30be0 62 79 3e 30 20 26 26 20 52 45 51 55 49 52 45 5f  by>0 && REQUIRE_
30bf0 50 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70 50  PTRMAP ) );.  pP
30c00 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
30c10 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
30c20 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
30c30 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
30c40 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
30c50 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
30c60 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
30c70 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
30c80 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
30c90 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
30ca0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
30cb0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
30cc0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
30cd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
30ce0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
30cf0 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
30d00 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
30d10 72 49 73 55 6e 6c 6f 63 6b 65 64 28 70 42 74 2d  rIsUnlocked(pBt-
30d20 3e 70 50 61 67 65 72 29 3d 3d 30 20 26 26 20 6e  >pPager)==0 && n
30d30 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
30d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
30d50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
30d60 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 70 61 67  .  /* Ensure pag
30d70 65 20 31 20 69 73 20 77 72 69 74 61 62 6c 65 2e  e 1 is writable.
30d80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
30d90 69 6c 6c 20 65 69 74 68 65 72 20 63 68 61 6e 67  ill either chang
30da0 65 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a  e the number.  *
30db0 2a 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  * of pages in th
30dc0 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 72 20 74  e free-list or t
30dd0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
30de0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 69  atabase file. Si
30df0 6e 63 65 20 62 6f 74 68 0a 20 20 2a 2a 20 6f 66  nce both.  ** of
30e00 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
30e10 73 20 69 6e 76 6f 6c 76 65 20 6d 6f 64 69 66 79  s involve modify
30e20 69 6e 67 20 70 61 67 65 20 31 20 68 65 61 64 65  ing page 1 heade
30e30 72 20 66 69 65 6c 64 73 2c 20 70 61 67 65 20 31  r fields, page 1
30e40 0a 20 20 2a 2a 20 77 69 6c 6c 20 64 65 66 69 6e  .  ** will defin
30e50 69 74 65 6c 79 20 62 65 20 77 72 69 74 74 65 6e  itely be written
30e60 20 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63   by this transac
30e70 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
30e80 20 61 6e 20 55 4e 4c 4f 43 4b 45 44 0a 20 20 2a   an UNLOCKED.  *
30e90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65  * transaction, e
30ea0 6e 73 75 72 65 20 74 68 65 20 42 74 72 65 65 50  nsure the BtreeP
30eb0 74 72 6d 61 70 20 73 74 72 75 63 74 75 72 65 20  trmap structure 
30ec0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
30ed0 65 64 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ed.  */.  rc = s
30ee0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30ef0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
30f00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
30f10 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
30f20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
30f30 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
30f40 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
30f50 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
30f60 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
30f70 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
30f80 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
30f90 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
30fa0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
30fb0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
30fc0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
30fd0 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
30fe0 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
30ff0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
31000 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
31010 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
31020 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31030 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
31040 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31050 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
31060 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
31070 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
31080 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
31090 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
310a0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
310b0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
310c0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
310d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
310e0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
310f0 41 43 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ACT ){.      ass
31100 65 72 74 28 20 49 53 41 55 54 4f 56 41 43 55 55  ert( ISAUTOVACUU
31110 4d 3d 3d 21 73 71 6c 69 74 65 33 50 61 67 65 72  M==!sqlite3Pager
31120 49 73 55 6e 6c 6f 63 6b 65 64 28 70 42 74 2d 3e  IsUnlocked(pBt->
31130 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
31140 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
31150 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  M ){.        if(
31160 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
31170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
31180 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  eType;.         
31190 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
311a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
311b0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
311c0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
311d0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
311e0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
311f0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
31200 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
31210 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
31220 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
31230 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
31240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
31250 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
31260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31270 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
31280 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
31290 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
312a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
312b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
312c0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
312d0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
312e0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
312f0 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
31300 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
31310 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
31320 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
31330 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
31340 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
31350 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
31360 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
31370 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31380 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
31390 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
313a0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
313b0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
313c0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
313d0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
313e0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
313f0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
31400 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
31410 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
31420 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
31430 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
31440 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
31450 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
31460 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
31470 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
31480 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
31490 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
314a0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
314b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
314c0 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
314d0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
314e0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
314f0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
31500 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
31510 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
31520 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
31530 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
31540 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
31550 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
31560 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
31570 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
31580 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31590 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
315a0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
315b0 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
315c0 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
315d0 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
315e0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
315f0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
31600 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
31610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31620 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
31630 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
31640 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
31650 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
31660 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
31670 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
31680 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
31690 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
316a0 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
316b0 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
316c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
316d0 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
316e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
316f0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
31700 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
31710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31720 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
31730 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
31740 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
31750 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
31760 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
31770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
31780 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
31790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
317a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
317b0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
317c0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
317d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
317e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
317f0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
31800 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31810 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31820 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
31830 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
31840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31850 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
31860 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
31870 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
31880 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
31890 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
318a0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
318b0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
318c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
318d0 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
318e0 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
318f0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
31900 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
31910 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
31920 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
31930 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
31940 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
31950 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
31960 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
31970 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
31980 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
31990 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
319a0 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
319b0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
319c0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
319d0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
319e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
319f0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
31a00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31a10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31a20 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
31a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
31a50 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
31a60 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
31a70 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
31a80 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
31a90 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
31aa0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
31ab0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
31ac0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
31ad0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
31ae0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
31af0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
31b00 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
31b10 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
31b20 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
31b30 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
31b40 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
31b50 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
31b60 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
31b70 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
31b80 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
31b90 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
31ba0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
31bb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31bc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31bd0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31be0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
31bf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31c00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31c10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
31c20 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
31c30 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
31c40 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
31c50 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
31c60 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
31c70 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
31c80 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
31c90 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
31ca0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
31cb0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
31cc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
31cd0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
31ce0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
31cf0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
31d00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31d10 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
31d20 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
31d30 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
31d40 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
31d50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
31d60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31d70 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
31d80 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
31d90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
31da0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31db0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31dc0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
31dd0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
31de0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
31df0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
31e00 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
31e10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
31e20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
31e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
31e40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
31e50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31e60 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
31e70 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
31e80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
31eb0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31ec0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
31ed0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
31ee0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
31ef0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
31f00 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
31f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31f20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31f30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
31f40 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
31f50 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
31f60 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
31f70 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
31f80 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
31f90 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
31fa0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
31fb0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
31fc0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
31fd0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
31fe0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
31ff0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
32000 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
32010 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
32020 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
32030 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
32040 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32050 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
32060 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
32070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32080 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
32090 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
320a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
320b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
320c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
320d0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
320e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
320f0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
32100 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
32110 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
32120 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
32130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32150 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32160 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
32180 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32190 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
321a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
321b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
321c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
321d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
321e0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
321f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32200 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32210 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32220 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32230 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32240 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
32250 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
32260 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
32270 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32280 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
32290 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
322a0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
322b0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
322c0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
322d0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
322e0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
322f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32300 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
32310 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
32320 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
32330 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
32340 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
32350 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
32360 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
32370 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
32380 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
32390 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
323a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
323b0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
323c0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
323d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
323e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
323f0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32400 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32420 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
32430 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
32440 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
32450 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
32470 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
32480 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
32490 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
324a0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
324b0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
324c0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
324d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
324e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
324f0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
32500 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
32510 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
32520 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
32530 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
32540 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
32550 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
32560 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
32570 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
32580 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
32590 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
325a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
325b0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
325c0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
325d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
325e0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
325f0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
32600 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
32610 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
32620 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
32630 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
32640 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
32650 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
32660 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
32670 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
32680 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32690 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
326a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
326b0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
326c0 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
326d0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
326e0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
326f0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
32700 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
32710 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32720 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
32730 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
32740 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
32750 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
32760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
32770 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
32780 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
32790 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
327a0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
327b0 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
327c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
327d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
327e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
327f0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
32800 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
32810 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
32820 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
32830 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
32840 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32850 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
32860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
32870 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
32880 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32890 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
328a0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
328b0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
328c0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
328d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
328e0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
328f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
32900 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
32910 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
32920 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
32930 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
32940 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
32950 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
32960 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
32970 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
32980 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
32990 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
329a0 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
329b0 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
329c0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
329d0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
329e0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
329f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
32a00 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
32a10 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
32a20 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
32a30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32a40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32a50 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
32a60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
32a70 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
32a80 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
32a90 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
32aa0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
32ab0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32ac0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
32ad0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
32ae0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
32af0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
32b00 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
32b10 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
32b20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
32b30 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
32b40 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
32b50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
32b60 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
32b70 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
32b80 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
32b90 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
32ba0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
32bb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32bc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32bd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32be0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
32bf0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
32c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
32c10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32c30 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
32c40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32c50 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
32c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
32c70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32c80 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
32c90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
32ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
32cb0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
32cc0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
32cd0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
32ce0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
32cf0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
32d00 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
32d10 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
32d20 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
32d30 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
32d40 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
32d50 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
32d60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
32d70 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
32d80 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
32d90 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
32da0 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
32db0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
32dc0 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
32dd0 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
32de0 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
32df0 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
32e00 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
32e10 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
32e20 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
32e30 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
32e40 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
32e50 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
32e60 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
32e70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
32e80 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
32e90 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
32ea0 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
32eb0 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
32ec0 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
32ed0 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
32ee0 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
32ef0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
32f00 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
32f10 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
32f20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
32f30 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
32f40 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
32f50 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
32f60 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
32f70 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
32f80 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
32f90 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
32fa0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32fb0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
32fc0 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
32fd0 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
32fe0 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
32ff0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
33000 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
33010 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
33020 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
33030 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
33040 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
33050 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
33060 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
33070 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
33080 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
33090 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
330a0 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
330b0 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
330c0 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
330d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
330e0 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
330f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
33100 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
33110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
33120 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
33130 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
33140 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
33150 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
33160 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
33170 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33180 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
33190 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
331a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
331b0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
331c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
331d0 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
331e0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
331f0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
33200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33210 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33220 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
33230 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
33240 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
33250 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
33260 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
33270 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
33280 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
33290 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
332a0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
332b0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
332c0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
332d0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
332e0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
332f0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
33300 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
33310 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
33320 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
33330 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
33340 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
33350 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
33360 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
33370 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
33380 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
33390 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
333a0 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
333b0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
333c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
333d0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
333e0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
333f0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
33400 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
33410 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
33420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33440 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33450 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
33460 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
33470 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
33480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33490 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
334a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
334b0 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
334c0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
334d0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
334e0 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
334f0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
33500 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
33510 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
33520 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
33530 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
33540 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
33550 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
33560 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
33570 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
33580 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
33590 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
335a0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
335b0 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
335c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
335d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
335e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
335f0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
33600 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
33610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33620 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
33630 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
33640 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
33650 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
33660 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
33670 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
33680 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
33690 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
336a0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
336b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
336c0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
336d0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
336e0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
336f0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
33700 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
33710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
33720 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
33730 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
33740 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
33750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
33760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
33770 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
33780 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
33790 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
337a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
337b0 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
337c0 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
337d0 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
337e0 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
337f0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
33800 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
33810 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
33820 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
33830 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
33840 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
33850 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
33860 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
33870 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
33880 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
33890 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
338a0 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
338b0 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
338c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
338d0 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
338e0 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
338f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
33900 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
33910 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
33920 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
33930 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
33940 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
33950 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
33960 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
33970 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
33980 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
33990 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
339a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
339b0 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
339c0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
339d0 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
339e0 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
339f0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
33a00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33a10 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
33a20 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
33a30 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
33a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33a50 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
33a60 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
33a70 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
33a80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
33a90 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
33aa0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
33ab0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
33ac0 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
33ad0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
33ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
33af0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
33b00 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
33b10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
33b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
33b40 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
33b50 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
33b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33b70 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
33b80 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
33b90 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
33ba0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
33bb0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
33bc0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
33bd0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
33be0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
33bf0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
33c00 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
33c10 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
33c20 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
33c30 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33c40 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
33c50 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
33c60 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
33c70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
33c80 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
33c90 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
33ca0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
33cb0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
33cc0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
33cd0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
33ce0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
33cf0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
33d00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33d10 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
33d20 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
33d30 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
33d40 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
33d50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
33d60 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
33d70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
33d80 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
33d90 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
33da0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
33db0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
33dc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
33dd0 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
33de0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
33df0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
33e00 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
33e10 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
33e20 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
33e30 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
33e40 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
33e50 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
33e60 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
33e70 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
33e80 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
33e90 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
33ea0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
33eb0 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
33ec0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
33ed0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33ee0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
33ef0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
33f00 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
33f10 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
33f20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
33f30 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
33f40 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
33f50 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
33f60 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
33f70 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
33f80 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
33f90 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 52 45  e..  */.  if( RE
33fa0 51 55 49 52 45 5f 50 54 52 4d 41 50 20 29 7b 0a  QUIRE_PTRMAP ){.
33fb0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
33fc0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
33fd0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
33fe0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
33ff0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34000 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
34010 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
34020 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
34030 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
34040 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
34050 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
34060 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
34070 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
34080 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
34090 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
340a0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
340b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
340c0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
340d0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
340e0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
340f0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34100 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
34110 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
34120 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
34130 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
34140 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
34150 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
34160 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
34170 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
34180 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
34190 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
341a0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
341b0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
341c0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
341d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
341e0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
341f0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
34200 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
34210 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
34220 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
34230 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
34240 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
34250 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
34260 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
34270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
34290 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
342a0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
342b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
342c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
342d0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
342e0 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
342f0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
34300 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
34310 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
34320 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34330 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34340 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
34350 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
34360 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
34370 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
34380 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
34390 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
343a0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
343b0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
343c0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
343d0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
343e0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
343f0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
34400 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
34410 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
34420 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
34430 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
34440 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
34450 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
34460 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
34470 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
34480 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
34490 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
344a0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
344b0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
344c0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
344d0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
344e0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
344f0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
34500 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34510 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
34520 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
34530 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
34540 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
34550 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
34560 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
34570 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
34580 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
34590 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
345a0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
345b0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
345c0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
345d0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
345e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
345f0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
34600 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
34610 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
34620 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
34630 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
34640 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
34650 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
34660 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
34670 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
34680 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
34690 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
346a0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
346b0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
346c0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
346d0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
346e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
346f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34700 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
34710 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
34720 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
34730 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
34740 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
34750 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
34760 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
34770 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
34780 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
34790 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
347a0 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
347b0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
347c0 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
347d0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
347e0 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
347f0 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
34800 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
34810 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34820 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
34830 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34850 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
34860 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
34870 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
34880 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
34890 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
348a0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
348b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
348c0 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
348d0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
348e0 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
348f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34900 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
34910 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
34920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34930 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
34940 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
34950 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
34960 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
34970 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
34980 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
34990 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
349a0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
349b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
349c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
349d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
349e0 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
349f0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
34a00 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
34a10 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
34a20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
34a30 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
34a40 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
34a50 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
34a60 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
34a70 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
34a80 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
34a90 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
34aa0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
34ab0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
34ac0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
34ad0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
34ae0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
34af0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
34b00 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
34b10 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
34b20 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
34b30 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
34b40 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
34b50 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
34b60 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
34b70 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
34b80 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
34b90 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34ba0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
34bb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34bc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
34bd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
34bf0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34c00 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
34c10 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
34c20 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
34c30 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
34c40 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
34c50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
34c60 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
34c70 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
34c80 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
34c90 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
34ca0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
34cb0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
34cc0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
34cd0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
34ce0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
34cf0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
34d00 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
34d10 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
34d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34d30 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
34d40 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
34d50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
34d60 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
34d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
34d80 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
34d90 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
34da0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
34db0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
34dc0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
34dd0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
34de0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
34df0 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
34e00 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
34e10 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
34e20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
34e30 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
34e40 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
34e50 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
34e60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
34e70 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
34e80 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
34e90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
34ea0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
34eb0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
34ec0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
34ed0 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
34ee0 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
34ef0 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
34f00 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
34f10 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
34f20 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
34f30 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
34f40 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
34f50 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
34f60 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
34f70 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
34f80 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
34f90 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
34fa0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
34fb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34fc0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
34fd0 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
34fe0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
34ff0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
35000 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
35010 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
35020 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
35030 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
35040 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
35050 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
35060 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
35070 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
35080 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
35090 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
350a0 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  w+3 > pPage->aDa
350b0 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
350c0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
350d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
350e0 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
350f0 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
35100 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
35110 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
35120 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
35130 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
35140 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
35150 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
35160 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
35170 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35180 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
35190 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
351a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
351b0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
351c0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
351d0 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20  assert( nOvfl>0 
351e0 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54  || .    (CORRUPT
351f0 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61  _DB && (info.nPa
35200 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
35210 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
35220 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
35230 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
35240 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
35250 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
35260 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
35270 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
35280 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
35290 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
352a0 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
352b0 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
352c0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
352d0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
352e0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
352f0 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
35300 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
35310 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
35320 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
35330 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
35340 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
35350 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
35360 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
35370 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
35380 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
35390 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
353a0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
353b0 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
353c0 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
353d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
353e0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
353f0 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
35400 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
35410 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
35420 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
35430 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
35440 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
35450 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
35460 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
35470 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
35480 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
35490 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
354a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
354b0 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
354c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
354d0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
354e0 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
354f0 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
35500 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
35510 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
35520 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
35530 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
35540 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
35550 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
35560 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
35570 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
35580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
35590 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
355a0 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
355b0 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
355c0 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
355d0 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
355e0 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
355f0 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
35600 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
35610 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
35620 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
35630 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
35640 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
35650 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
35660 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
35670 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
35680 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
35690 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
356a0 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
356b0 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
356c0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
356d0 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
356e0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
356f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35700 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
35710 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
35720 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
35730 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
35740 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
35750 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
35760 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
35770 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
35780 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
35790 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
357a0 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
357b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
357c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
357d0 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
357e0 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
357f0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
35800 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
35810 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
35820 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
35830 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
35840 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
35850 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
35860 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
35870 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
35880 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
35890 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
358a0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
358b0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
358c0 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
358d0 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
358e0 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
358f0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
35900 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
35910 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
35920 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
35930 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
35940 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
35950 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
35960 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
35970 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
35980 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
35990 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
359a0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
359b0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
359c0 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
359d0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
359e0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
359f0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
35a00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
35a10 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
35a20 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
35a30 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
35a40 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
35a50 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
35a60 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
35a70 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
35a80 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
35a90 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
35aa0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
35ab0 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
35ac0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
35ad0 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
35ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
35af0 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
35b00 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
35b10 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
35b20 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
35b30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
35b40 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
35b50 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
35b60 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
35b70 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
35b80 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
35b90 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
35ba0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
35bb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
35bc0 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
35bd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
35be0 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
35bf0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
35c00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
35c10 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
35c20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
35c30 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
35c40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
35c50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35c60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
35c70 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
35c80 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
35c90 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
35ca0 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
35cb0 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
35cc0 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
35cd0 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
35ce0 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
35cf0 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
35d00 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
35d10 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
35d20 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
35d30 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
35d40 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
35d50 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
35d60 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
35d70 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
35d80 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
35d90 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
35da0 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
35db0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
35dc0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
35dd0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
35de0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
35df0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
35e00 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
35e10 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
35e20 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65  ayload);.  }else
35e30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44  {.    assert( nD
35e40 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ata==0 );.    as
35e50 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29  sert( nZero==0 )
35e60 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
35e70 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
35e80 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
35e90 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a  u64*)&nKey);.  .
35ea0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
35eb0 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f   payload size */
35ec0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
35ed0 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
35ee0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
35ef0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
35f00 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
35f10 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28  se{ .    assert(
35f20 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66   nKey<=0x7ffffff
35f30 66 20 26 26 20 70 4b 65 79 21 3d 30 20 29 3b 0a  f && pKey!=0 );.
35f40 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
35f50 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
35f60 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
35f70 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
35f80 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c  .  }.  if( nPayl
35f90 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
35fa0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  ocal ){.    n = 
35fb0 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
35fc0 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
35fd0 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
35fe0 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
35ff0 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
36000 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
36010 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c   = n;.    spaceL
36020 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  eft = nPayload;.
36030 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65      pPrior = pCe
36040 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
36050 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d   int mn = pPage-
36060 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
36070 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61   = mn + (nPayloa
36080 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65  d - mn) % (pPage
36090 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
360a0 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
360b0 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
360c0 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
360d0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
360e0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
360f0 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50  ;.    if( n > pP
36100 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
36110 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63  n = mn;.    spac
36120 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a  eLeft = n;.    *
36130 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
36140 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50  ader + 4;.    pP
36150 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
36160 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20  eader+n];.  }.  
36170 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
36180 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f  l[nHeader];..  /
36190 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
361a0 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
361b0 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
361c0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
361d0 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
361e0 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
361f0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
36200 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
36210 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
36220 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
36230 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
36240 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
36250 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
36260 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
36270 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
36280 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
36290 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
362a0 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
362b0 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
362c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
362d0 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
362e0 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
362f0 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
36300 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
36310 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
36320 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
36330 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
36340 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
36350 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
36360 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
36370 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
36380 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
36390 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
363a0 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
363b0 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
363c0 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
363d0 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53  ctly..  */.#if S
363e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a  QLITE_DEBUG.  {.
363f0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
36400 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  o;.    pPage->xP
36410 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
36420 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
36430 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64     assert( nHead
36440 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  er=(int)(info.pP
36450 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
36460 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
36470 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
36480 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
36490 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53  nSize == info.nS
364a0 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
364b0 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20  t( spaceLeft == 
364c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20  info.nLocal );. 
364d0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
364e0 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  r == &pCell[info
364f0 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20  .iOverflow] );. 
36500 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
36510 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61  Write the payloa
36520 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  d into the local
36530 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78   Cell and any ex
36540 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  tra into overflo
36550 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69  w pages */.  whi
36560 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
36570 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
36580 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
36590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
365a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
365b0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
365c0 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
365d0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
365e0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
365f0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
36600 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36610 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
36620 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
36630 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
36640 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
36650 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
36660 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
36670 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
36680 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36690 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
366a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
366b0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
366c0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
366d0 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
366e0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
366f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36700 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
36710 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
36720 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
36730 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
36740 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
36750 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
36760 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
36770 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
36780 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
36790 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
367a0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
367b0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
367c0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
367d0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
367e0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
367f0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
36800 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
36810 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
36820 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
36830 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
36840 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
36850 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
36860 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
36870 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
36880 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
36890 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
368a0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
368b0 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
368c0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
368d0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
368e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
368f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36900 20 69 66 28 20 52 45 51 55 49 52 45 5f 50 54 52   if( REQUIRE_PTR
36910 4d 41 50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  MAP && rc==SQLIT
36920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36930 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
36940 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
36950 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
36960 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
36970 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
36980 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
36990 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
369a0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
369b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
369c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
369d0 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
369e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
369f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
36a00 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
36a10 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
36a20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36a30 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
36a40 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
36a50 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
36a60 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
36a70 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
36a80 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
36a90 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
36aa0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
36ab0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
36ac0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
36ad0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
36ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36af0 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
36b00 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
36b10 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
36b20 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
36b30 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
36b40 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
36b50 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
36b60 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
36b70 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
36b80 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
36b90 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
36ba0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
36bb0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
36bc0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
36bd0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
36be0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36bf0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36c00 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
36c10 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
36c20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
36c30 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
36c40 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
36c50 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
36c60 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
36c70 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
36c80 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
36c90 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
36ca0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
36cb0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
36cc0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
36cd0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
36ce0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
36cf0 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
36d00 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
36d10 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
36d20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
36d30 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
36d40 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
36d50 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
36d60 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
36d70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
36d80 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
36d90 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
36da0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
36db0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
36dc0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
36dd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
36de0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
36df0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
36e00 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
36e10 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
36e20 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
36e30 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
36e40 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
36e50 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
36e60 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
36e70 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
36e80 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
36e90 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
36ea0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
36eb0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
36ec0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36ed0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
36ee0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
36ef0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
36f00 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
36f10 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
36f20 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
36f30 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
36f40 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
36f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
36f60 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
36f70 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
36f80 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
36f90 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
36fa0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
36fb0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
36fc0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
36fd0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
36fe0 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
36ff0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
37000 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
37010 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
37020 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
37030 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
37040 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
37050 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
37060 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
37070 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
37080 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
37090 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
370a0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
370b0 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
370c0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
370d0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
370e0 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
370f0 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
37100 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
37110 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
37120 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
37130 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
37140 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
37150 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
37160 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
37170 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
37180 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
37190 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
371a0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
371b0 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
371c0 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
371d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
371e0 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
371f0 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
37200 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
37210 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
37220 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
37230 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
37240 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
37250 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
37260 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
37270 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
37280 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
37290 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
372a0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
372b0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
372c0 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
372d0 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
372e0 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
372f0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
37300 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
37310 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
37320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
37330 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
37340 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
37350 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
37360 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37370 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
37380 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
37390 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
373a0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
373b0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
373c0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
373d0 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
373e0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
373f0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
37400 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
37410 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
37420 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
37430 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
37440 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
37450 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
37460 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
37470 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
37480 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
37490 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
374a0 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
374b0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
374c0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
374d0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
374e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
374f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
37500 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
37510 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
37520 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
37530 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
37540 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
37550 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
37560 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
37570 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
37580 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
37590 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
375a0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
375b0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
375c0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
375d0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
375e0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
375f0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
37600 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
37610 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
37620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
37630 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
37640 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
37650 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
37660 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
37670 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
37680 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
37690 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
376a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
376b0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
376c0 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
376d0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
376e0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
376f0 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
37700 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
37710 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
37720 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
37730 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
37740 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
37750 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
37760 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
37770 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
37780 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
37790 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
377a0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
377b0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
377c0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
377d0 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
377e0 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
377f0 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
37800 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
37810 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
37820 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
37830 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
37840 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
37850 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
37860 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
37870 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
37880 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
37890 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
378a0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
378b0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
378c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
378d0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
378e0 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
378f0 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
37900 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
37910 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
37920 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
37930 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
37940 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
37950 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
37960 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
37970 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
37980 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
37990 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
379a0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
379b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
379c0 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
379d0 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
379e0 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
379f0 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
37a00 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
37a10 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
37a20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
37a30 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
37a40 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
37a50 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
37a60 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
37a70 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
37a80 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
37a90 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
37aa0 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
37ab0 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
37ac0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
37ad0 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
37ae0 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
37af0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
37b00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
37b10 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  nter */.  u8 *da
37b20 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
37b30 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
37b40 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
37b50 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20    u8 *pIns;     
37b60 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
37b70 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
37b80 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63  Idx[] where no c
37b90 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ell inserted */.
37ba0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
37bb0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
37bc0 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
37bd0 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
37be0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
37bf0 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70  ssert( MX_CELL(p
37c00 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
37c10 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
37c20 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
37c30 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
37c40 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
37c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37c60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
37c70 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
37c80 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
37c90 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
37ca0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
37cb0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
37cc0 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
37cd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37ce0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
37cf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
37d00 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
37d10 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
37d20 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
37d30 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
37d40 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
37d50 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
37d60 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
37d70 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
37d80 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
37d90 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
37da0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
37db0 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
37dc0 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
37dd0 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
37de0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
37df0 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
37e00 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
37e10 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
37e20 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
37e30 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
37e40 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
37e50 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
37e60 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
37e70 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  z==pPage->xCellS
37e80 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ize(pPage, pCell
37e90 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
37ea0 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
37eb0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
37ec0 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
37ed0 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
37ee0 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
37ef0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
37f00 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
37f10 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
37f20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
37f30 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
37f40 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
37f50 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
37f60 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
37f70 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
37f80 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
37f90 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
37fa0 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
37fb0 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
37fc0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
37fd0 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
37fe0 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
37ff0 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20  [j] = (u16)i;.. 
38000 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69     /* When multi
38010 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63  ple overflows oc
38020 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c  cur, they are al
38030 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20  ways sequential 
38040 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  and in.    ** so
38050 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69  rted order.  Thi
38060 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69  s invariants ari
38070 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69  se because multi
38080 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61  ple overflows ca
38090 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63  n.    ** only oc
380a0 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69  cur when inserti
380b0 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ng divider cells
380c0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
380d0 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20   page during.   
380e0 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61   ** balancing, a
380f0 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20  nd the dividers 
38100 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64  are adjacent and
38110 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   sorted..    */.
38120 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
38130 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66   || pPage->aiOvf
38140 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b  l[j-1]<(u16)i );
38150 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e   /* Overflows in
38160 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f   sorted order */
38170 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
38180 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61  0 || i==pPage->a
38190 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20  iOvfl[j-1]+1 ); 
381a0 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61    /* Overflows a
381b0 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f  re sequential */
381c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42 74  .  }else{.    Bt
381d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
381e0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 69 6e  age->pBt;.    in
381f0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
38200 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
38210 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
38220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38230 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
38240 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
38250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
38260 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
38270 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
38280 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
38290 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
382a0 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >aData;.    asse
382b0 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d  rt( &data[pPage-
382c0 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50  >cellOffset]==pP
382d0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b  age->aCellIdx );
382e0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
382f0 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
38300 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
38310 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
38320 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
38330 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
38340 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
38350 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
38360 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74  ollowing propert
38370 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
38380 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
38390 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73  fully */.    ass
383a0 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b  ert( idx >= 0 );
383b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
383c0 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f   >= pPage->cellO
383d0 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
383e0 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50  Cell+2 || CORRUP
383f0 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
38400 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
38410 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
38420 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
38430 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
38440 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
38450 63 70 79 28