/ Hex Artifact Content
Login

Artifact ca6c7e4bbbf91b6c91d0278942b917e81d3fc18d:


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 0a  ARED_CACHE */...
3a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3a80: 41 42 4c 45 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  ABLE_CONCURRENT.
3a90: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3aa0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2d 20  ing structure - 
3ab0: 42 74 72 65 65 50 74 72 6d 61 70 20 2d 20 73 74  BtreePtrmap - st
3ac0: 6f 72 65 73 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ores the in-memo
3ad0: 72 79 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a  ry pointer map.*
3ae0: 2a 20 75 73 65 64 20 66 6f 72 20 6e 65 77 6c 79  * used for newly
3af0: 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73   allocated pages
3b00: 20 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   in CONCURRENT t
3b10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 53 75 63  ransactions. Suc
3b20: 68 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  h pages are.** a
3b30: 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 20  lways allocated 
3b40: 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  in a contiguous 
3b50: 62 6c 6f 63 6b 20 28 66 72 6f 6d 20 74 68 65 20  block (from the 
3b60: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 29  end of the file)
3b70: 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74   starting.** wit
3b80: 68 20 70 61 67 65 20 42 74 72 65 65 50 74 72 6d  h page BtreePtrm
3b90: 61 70 2e 69 46 69 72 73 74 2e 0a 2a 2f 0a 74 79  ap.iFirst..*/.ty
3ba0: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f 6c  pedef struct Rol
3bb0: 6c 62 61 63 6b 45 6e 74 72 79 20 52 6f 6c 6c 62  lbackEntry Rollb
3bc0: 61 63 6b 45 6e 74 72 79 3b 0a 74 79 70 65 64 65  ackEntry;.typede
3bd0: 66 20 73 74 72 75 63 74 20 50 74 72 6d 61 70 45  f struct PtrmapE
3be0: 6e 74 72 79 20 50 74 72 6d 61 70 45 6e 74 72 79  ntry PtrmapEntry
3bf0: 3b 0a 73 74 72 75 63 74 20 50 74 72 6d 61 70 45  ;.struct PtrmapE
3c00: 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70 61  ntry {.  Pgno pa
3c10: 72 65 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65  rent;.  u8 eType
3c20: 3b 0a 7d 3b 0a 73 74 72 75 63 74 20 52 6f 6c 6c  ;.};.struct Roll
3c30: 62 61 63 6b 45 6e 74 72 79 20 7b 0a 20 20 50 67  backEntry {.  Pg
3c40: 6e 6f 20 70 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20  no pgno;.  Pgno 
3c50: 70 61 72 65 6e 74 3b 0a 20 20 75 38 20 65 54 79  parent;.  u8 eTy
3c60: 70 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20 42 74  pe;.};.struct Bt
3c70: 72 65 65 50 74 72 6d 61 70 20 7b 0a 20 20 50 67  reePtrmap {.  Pg
3c80: 6e 6f 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  no iFirst;      
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ca0: 20 46 69 72 73 74 20 6e 65 77 20 70 61 67 65 20   First new page 
3cb0: 6e 75 6d 62 65 72 20 61 50 74 72 5b 30 5d 20 2a  number aPtr[0] *
3cc0: 2f 0a 0a 20 20 69 6e 74 20 6e 50 74 72 41 6c 6c  /..  int nPtrAll
3cd0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3ce0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
3cf0: 64 20 73 69 7a 65 20 6f 66 20 61 50 74 72 5b 5d  d size of aPtr[]
3d00: 20 61 72 72 61 79 20 2a 2f 0a 20 20 50 74 72 6d   array */.  Ptrm
3d10: 61 70 45 6e 74 72 79 20 2a 61 50 74 72 3b 20 20  apEntry *aPtr;  
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3d30: 72 72 61 79 20 6f 66 20 70 61 72 65 6e 74 20 70  rray of parent p
3d40: 61 67 65 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  age numbers */..
3d50: 20 20 69 6e 74 20 6e 53 76 70 74 3b 20 20 20 20    int nSvpt;    
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65 20 6f    /* Used size o
3d80: 66 20 61 53 76 70 74 5b 5d 20 61 72 72 61 79 20  f aSvpt[] array 
3d90: 2a 2f 0a 20 20 69 6e 74 20 6e 53 76 70 74 41 6c  */.  int nSvptAl
3da0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
3db0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
3dc0: 64 20 73 69 7a 65 20 6f 66 20 61 53 76 70 74 5b  d size of aSvpt[
3dd0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 76 70  ] */.  int *aSvp
3de0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3df0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3e00: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 65 6e 74 72  aRollback[] entr
3e10: 79 20 66 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  y for savepoint 
3e20: 69 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c  i */..  int nRol
3e30: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
3e40: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
3e50: 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63  size of aRollbac
3e60: 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  k[] array */.  i
3e70: 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f  nt nRollbackAllo
3e80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
3e90: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
3ea0: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
3eb0: 61 72 72 61 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62  array */.  Rollb
3ec0: 61 63 6b 45 6e 74 72 79 20 2a 61 52 6f 6c 6c 62  ackEntry *aRollb
3ed0: 61 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 41 72  ack;       /* Ar
3ee0: 72 61 79 20 6f 66 20 72 6f 6c 6c 62 61 63 6b 20  ray of rollback 
3ef0: 65 6e 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  entries */.};../
3f00: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
3f10: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
3f20: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
3f30: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
3f40: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
3f50: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
3f60: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
3f70: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
3f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
3f90: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
3fa0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3fb0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
3fc0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
3fd0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
3fe0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
3ff0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
4000: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4010: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4020: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4030: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4040: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4050: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4060: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4070: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4080: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4090: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
40a0: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
40b0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
40c0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
40d0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
40e0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
40f0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
4100: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4110: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4120: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4130: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4140: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4150: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4160: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4170: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4180: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4190: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
41a0: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
41b0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
41c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
41d0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
41e0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
41f0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
4200: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4210: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4220: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4230: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4240: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4250: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4260: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4270: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4280: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4290: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
42a0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
42b0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
42c0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
42d0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
42e0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
42f0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
4300: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4310: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4320: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4330: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4340: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4350: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4360: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4370: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4380: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4390: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
43a0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
43b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
43c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
43d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
43e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
43f0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
4400: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4410: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4420: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4430: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4440: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4450: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4460: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4470: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4480: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4490: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
44a0: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
44b0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
44c0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
44d0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
44e0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
44f0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
4500: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4510: 55 70 64 61 74 65 20 74 68 65 20 61 50 74 72 5b  Update the aPtr[
4520: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 70  ] array */.    p
4530: 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79  Map->aPtr[iEntry
4540: 5d 2e 70 61 72 65 6e 74 20 3d 20 70 61 72 65 6e  ].parent = paren
4550: 74 3b 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50 74  t;.    pMap->aPt
4560: 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65 20  r[iEntry].eType 
4570: 3d 20 65 54 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  = eType;.  }..  
4580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
45a0: 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
45b0: 6f 69 6e 74 2c 20 69 66 20 69 74 20 69 73 20 6e  oint, if it is n
45c0: 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
45d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
45e0: 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28  treePtrmapBegin(
45f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
4600: 6e 74 20 6e 53 76 70 74 29 7b 0a 20 20 42 74 72  nt nSvpt){.  Btr
4610: 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d  eePtrmap *pMap =
4620: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66   pBt->pMap;.  if
4630: 28 20 70 4d 61 70 20 26 26 20 6e 53 76 70 74 3c  ( pMap && nSvpt<
4640: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20  pMap->nSvpt ){. 
4650: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
4660: 28 20 6e 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e  ( nSvpt>=pMap->n
4670: 53 76 70 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  SvptAlloc ){.   
4680: 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d     int nNew = pM
4690: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f  ap->nSvptAlloc ?
46a0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f   pMap->nSvptAllo
46b0: 63 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20 20 20  c*2 : 16;.      
46c0: 69 6e 74 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69  int *aNew = sqli
46d0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70  te3_realloc(pMap
46e0: 2d 3e 61 53 76 70 74 2c 20 73 69 7a 65 6f 66 28  ->aSvpt, sizeof(
46f0: 69 6e 74 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20  int) * nNew);.  
4700: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
4710: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4720: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4730: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4740: 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76 70 74       pMap->aSvpt
4750: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
4760: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f   pMap->nSvptAllo
4770: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  c = nNew;.      
4780: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
4790: 28 69 3d 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20  (i=pMap->nSvpt; 
47a0: 69 3c 6e 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20  i<nSvpt; i++){. 
47b0: 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76 70 74       pMap->aSvpt
47c0: 5b 69 5d 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c  [i] = pMap->nRol
47d0: 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  lback;.    }.   
47e0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e   pMap->nSvpt = n
47f0: 53 76 70 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Svpt;.  }..  ret
4800: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4810: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
4820: 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49   (if op==SAVEPOI
4830: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72 20  NT_ROLLBACK) or 
4840: 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d 3d  release (if op==
4850: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
4860: 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  E).** savepoint 
4870: 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  iSvpt..*/.static
4880: 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d 61   void btreePtrma
4890: 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a 70  pEnd(BtShared *p
48a0: 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  Bt, int op, int 
48b0: 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  iSvpt){.  BtreeP
48c0: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
48d0: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
48e0: 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Map ){.    asser
48f0: 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
4900: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d  _ROLLBACK || op=
4910: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4920: 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  SE );.    assert
4930: 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28 69  ( iSvpt>=0 || (i
4940: 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  Svpt==-1 && op==
4950: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
4960: 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 69  CK) );.    if( i
4970: 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Svpt<0 ){.      
4980: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b  pMap->nSvpt = 0;
4990: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f  .      pMap->nRo
49a0: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
49b0: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e 61    memset(pMap->a
49c0: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Ptr, 0, sizeof(P
49d0: 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50 74  gno) * pMap->nPt
49e0: 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65 6c  rAlloc);.    }el
49f0: 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d 61  se if( iSvpt<pMa
4a00: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a10: 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
4a20: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
4a30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
4a40: 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 70          for(ii=p
4a50: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31  Map->nRollback-1
4a60: 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76 70  ; ii>=pMap->aSvp
4a70: 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29 7b  t[iSvpt]; ii--){
4a80: 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c 62  .          Rollb
4a90: 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26 70  ackEntry *p = &p
4aa0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69  Map->aRollback[i
4ab0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50 74  i];.          Pt
4ac0: 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72  rmapEntry *pEntr
4ad0: 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b  y = &pMap->aPtr[
4ae0: 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e  p->pgno - pMap->
4af0: 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20  iFirst];.       
4b00: 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e     pEntry->paren
4b10: 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20  t = p->parent;. 
4b20: 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d           pEntry-
4b30: 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
4b40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
4b50: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70 2d     }.      pMap-
4b60: 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20 2b  >nSvpt = iSvpt +
4b70: 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
4b80: 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
4b90: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
4ba0: 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69   = pMap->aSvpt[i
4bb0: 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Svpt];.    }.  }
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
4bd0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4be0: 64 20 61 66 74 65 72 20 61 6e 20 43 4f 4e 43 55  d after an CONCU
4bf0: 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
4c00: 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  n is opened on t
4c10: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
4c20: 49 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  It allocates the
4c30: 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
4c40: 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 74  ucture used to t
4c50: 72 61 63 6b 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  rack pointers.**
4c60: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   to allocated pa
4c70: 67 65 73 20 61 6e 64 20 7a 65 72 6f 65 73 20 74  ges and zeroes t
4c80: 68 65 20 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20  he nFree/iTrunk 
4c90: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 64 61  fields in the da
4ca0: 74 61 62 61 73 65 20 0a 2a 2a 20 68 65 61 64 65  tabase .** heade
4cb0: 72 20 6f 6e 20 70 61 67 65 20 31 2e 0a 2a 2f 0a  r on page 1..*/.
4cc0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4cd0: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 42  PtrmapAllocate(B
4ce0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
4cf0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4d00: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  _OK;.  if( pBt->
4d10: 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 42  pMap==0 ){.    B
4d20: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
4d30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
4d40: 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74  c(sizeof(BtreePt
4d50: 72 6d 61 70 29 29 3b 0a 20 20 20 20 69 66 28 20  rmap));.    if( 
4d60: 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMap==0 ){.     
4d70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4d80: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
4d90: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42 74       memset(&pBt
4da0: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
4db0: 33 32 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  32], 0, sizeof(u
4dc0: 33 32 29 2a 32 29 3b 0a 20 20 20 20 20 20 6d 65  32)*2);.      me
4dd0: 6d 73 65 74 28 70 4d 61 70 2c 20 30 2c 20 73 69  mset(pMap, 0, si
4de0: 7a 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61 70  zeof(BtreePtrmap
4df0: 29 29 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  ));.      pMap->
4e00: 69 46 69 72 73 74 20 3d 20 70 42 74 2d 3e 6e 50  iFirst = pBt->nP
4e10: 61 67 65 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  age + 1;.      p
4e20: 42 74 2d 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  Bt->pMap = pMap;
4e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4e40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4e50: 20 46 72 65 65 20 61 6e 79 20 42 74 72 65 65 50   Free any BtreeP
4e60: 74 72 6d 61 70 20 73 74 72 75 63 74 75 72 65 20  trmap structure 
4e70: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  allocated by an 
4e80: 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
4e90: 2a 2a 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c  ** btreePtrmapAl
4ea0: 6c 6f 63 61 74 65 28 29 2e 0a 2a 2f 0a 73 74 61  locate()..*/.sta
4eb0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 74  tic void btreePt
4ec0: 72 6d 61 70 44 65 6c 65 74 65 28 42 74 53 68 61  rmapDelete(BtSha
4ed0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 72  red *pBt){.  Btr
4ee0: 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d  eePtrmap *pMap =
4ef0: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66   pBt->pMap;.  if
4f00: 28 20 70 4d 61 70 20 29 7b 0a 20 20 20 20 73 71  ( pMap ){.    sq
4f10: 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70 2d  lite3_free(pMap-
4f20: 3e 61 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  >aRollback);.   
4f30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
4f40: 61 70 2d 3e 61 50 74 72 29 3b 0a 20 20 20 20 73  ap->aPtr);.    s
4f50: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70  qlite3_free(pMap
4f60: 2d 3e 61 53 76 70 74 29 3b 0a 20 20 20 20 73 71  ->aSvpt);.    sq
4f70: 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70 29  lite3_free(pMap)
4f80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20  ;.    pBt->pMap 
4f90: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  = 0;.  }.}.#else
4fa0: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
4fb0: 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 78 29  trmapAllocate(x)
4fc0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
4fd0: 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 44  ine btreePtrmapD
4fe0: 65 6c 65 74 65 28 78 29 20 0a 23 20 64 65 66 69  elete(x) .# defi
4ff0: 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 42 65  ne btreePtrmapBe
5000: 67 69 6e 28 78 2c 79 29 20 20 53 51 4c 49 54 45  gin(x,y)  SQLITE
5010: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72  _OK.# define btr
5020: 65 65 50 74 72 6d 61 70 45 6e 64 28 78 2c 79 2c  eePtrmapEnd(x,y,
5030: 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  z) .#endif..stat
5040: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
5050: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
5060: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
5070: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
5080: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
5090: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
50a0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
50b0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
50c0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
50d0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
50e0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
50f0: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
5100: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
5110: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
5120: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
5130: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
5140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5150: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
5160: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  x);.}.#endif../*
5170: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5180: 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
5190: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  e of the cursor 
51a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
51b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
51c0: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
51d0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
51e0: 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  Bt..*/.#define i
51f0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
5200: 77 43 61 63 68 65 28 70 43 75 72 29 20 28 70 43  wCache(pCur) (pC
5210: 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
5220: 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  ~BTCF_ValidOvfl)
5230: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
5240: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
5250: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
5260: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
5270: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
5280: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
5290: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
52a0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
52b0: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
52c0: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
52d0: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
52e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
52f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5300: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5310: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5320: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5330: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
5340: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
5350: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  che(p);.  }.}..#
5360: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5370: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
5380: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5390: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
53a0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
53b0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
53c0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
53d0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
53e0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
53f0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
5400: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
5410: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
5420: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
5430: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
5440: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
5450: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
5460: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
5470: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
5480: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
5490: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
54a0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
54b0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
54c0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
54d0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
54e0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
54f0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
5500: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
5510: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
5520: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
5530: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
5540: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
5550: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
5560: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
5570: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
5580: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
5590: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
55a0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
55b0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
55c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
55d0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
55e0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
55f0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
5600: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
5610: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
5620: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5640: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
5650: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
5660: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
5670: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
5680: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
5690: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
56a0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
56b0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20  ursor *p;.  if( 
56c0: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
56d0: 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75  lobCur==0 ) retu
56e0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rn;.  assert( sq
56f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
5700: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
5710: 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63    pBtree->hasInc
5720: 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20  rblobCur = 0;.  
5730: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
5740: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
5750: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
5760: 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73  if( (p->curFlags
5770: 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62   & BTCF_Incrblob
5780: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
5790: 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f  tree->hasIncrblo
57a0: 62 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  bCur = 1;.      
57b0: 69 66 28 20 69 73 43 6c 65 61 72 54 61 62 6c 65  if( isClearTable
57c0: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
57d0: 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ==iRow ){.      
57e0: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
57f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
5800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5810: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
5820: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
5830: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
5840: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
5850: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
5860: 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c  blobCursors(x,y,
5870: 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
5880: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
5890: 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  B */../*.** Set 
58a0: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
58b0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
58c0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
58d0: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
58e0: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
58f0: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
5900: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
5910: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
5920: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
5930: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
5940: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5950: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
5960: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
5970: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
5980: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
5990: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
59a0: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
59b0: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
59c0: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
59d0: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
59e0: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
59f0: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
5a00: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
5a10: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
5a20: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
5a30: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
5a40: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
5a50: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
5a60: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
5a70: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
5a80: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
5a90: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
5aa0: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
5ab0: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
5ac0: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
5ad0: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
5ae0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
5af0: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
5b00: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
5b10: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
5b20: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
5b30: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
5b40: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
5b50: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
5b60: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
5b70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
5b80: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
5b90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
5ba0: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
5bb0: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
5bc0: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
5bd0: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
5be0: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
5bf0: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
5c00: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
5c10: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
5c20: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
5c30: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
5c40: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
5c50: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
5c60: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
5c70: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
5c80: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
5c90: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
5ca0: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
5cb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
5cc0: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
5cd0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
5ce0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
5cf0: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
5d00: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
5d10: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
5d20: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
5d30: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
5d40: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
5d50: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
5d60: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
5d70: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
5d80: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
5d90: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
5da0: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
5db0: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
5dc0: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
5dd0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
5de0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
5df0: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
5e00: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
5e10: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
5e20: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
5e30: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
5e40: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
5e50: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
5e60: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
5e70: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
5e80: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
5e90: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
5ea0: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
5eb0: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
5ec0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
5ed0: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
5ee0: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
5ef0: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  omitted if the c
5f00: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
5f10: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
5f20: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
5f30: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
5f40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
5f50: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
5f60: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
5f70: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
5f80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5f90: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
5fa0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
5fb0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fc0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5fd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
5fe0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
5ff0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6000: 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65  pgno<=pBt->nPage
6010: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61   );.    pBt->pHa
6020: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
6030: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
6040: 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
6050: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
6060: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
6070: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
6090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
60a0: 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33  && pgno<=sqlite3
60b0: 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e  BitvecSize(pBt->
60c0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a  pHasContent) ){.
60d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
60e0: 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70  BitvecSet(pBt->p
60f0: 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f  HasContent, pgno
6100: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6110: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  rc;.}../*.** Que
6120: 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ry the BtShared.
6130: 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74  pHasContent vect
6140: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  or..**.** This f
6150: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6160: 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  d when a free-li
6170: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
6180: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
6190: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f  .** free-list fo
61a0: 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75  r reuse. It retu
61b0: 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20  rns false if it 
61c0: 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69  is safe to retri
61d0: 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  eve the.** page 
61e0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
61f0: 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
6200: 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
6210: 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77  set. True otherw
6220: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
6230: 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f  nt btreeGetHasCo
6240: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
6250: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
6260: 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70  .  Bitvec *p = p
6270: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b  Bt->pHasContent;
6280: 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
6290: 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74  (pgno>sqlite3Bit
62a0: 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71  vecSize(p) || sq
62b0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
62c0: 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f  p, pgno)));.}../
62d0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74  *.** Clear (dest
62e0: 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65  roy) the BtShare
62f0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
6300: 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c  tvec. This shoul
6310: 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  d be.** invoked 
6320: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
6330: 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d  n of each write-
6340: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
6350: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
6360: 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
6370: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
6380: 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
6390: 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61  Destroy(pBt->pHa
63a0: 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74  sContent);.  pBt
63b0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
63c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
63d0: 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ase all of the a
63e0: 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f  pPage[] pages fo
63f0: 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
6400: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6410: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
6420: 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a  Pages(BtCursor *
6430: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
6440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
6450: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
6460: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
6470: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
6480: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  );.    pCur->apP
6490: 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  age[i] = 0;.  }.
64a0: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
64b0: 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61  -1;.}.../*.** Sa
64c0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
64d0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69  ursor position i
64e0: 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  n the variables 
64f0: 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a  BtCursor.nKey .*
6500: 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70  * and BtCursor.p
6510: 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27  Key. The cursor'
6520: 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  s state is set t
6530: 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  o CURSOR_REQUIRE
6540: 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SEEK..**.** The 
6550: 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
6560: 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
6570: 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73  or is valid (has
6580: 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f   eState==CURSOR_
6590: 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20  VALID).** prior 
65a0: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
65b0: 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74  routine.  .*/.st
65c0: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
65d0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
65e0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
65f0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6600: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
6610: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20  pCur->eState || 
6620: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d  CURSOR_SKIPNEXT=
6630: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
6640: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
6650: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
6660: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6670: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6680: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
6690: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
66a0: 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72  NEXT ){.    pCur
66b0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
66c0: 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
66d0: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
66e0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Next = 0;.  }.  
66f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6700: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
6710: 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61  pCur->nKey);.  a
6720: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
6730: 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53  E_OK );  /* KeyS
6740: 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ize() cannot fai
6750: 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  l */..  /* If th
6760: 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20  is is an intKey 
6770: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
6780: 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74  above call to Bt
6790: 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a  reeKeySize().  *
67a0: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74  * stores the int
67b0: 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72  eger key in pCur
67c0: 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20  ->nKey. In this 
67d0: 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20  case this value 
67e0: 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74  is.  ** all that
67f0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74   is required. Ot
6800: 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72  herwise, if pCur
6810: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20   is not open on 
6820: 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74  an intKey.  ** t
6830: 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f  able, then mallo
6840: 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  c space for and 
6850: 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e  store the pCur->
6860: 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65  nKey bytes of ke
6870: 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20  y .  ** data..  
6880: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72  */.  if( 0==pCur
6890: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20  ->curIntKey ){. 
68a0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
68b0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70  sqlite3Malloc( p
68c0: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
68d0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
68e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
68f0: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
6900: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
6910: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
6920: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6930: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
6940: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
6950: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6960: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6970: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
6980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6990: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
69a0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
69b0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
69c0: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
69d0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
69e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
69f0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
6a00: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6a10: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
6a20: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6a30: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
6a40: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
6a50: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
6a60: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
6a70: 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
6a80: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
6a90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6aa0: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6ab0: 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72  sorsOnList(BtCur
6ac0: 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73  sor*,Pgno,BtCurs
6ad0: 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  or*);../*.** Sav
6ae0: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
6af0: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28  of all cursors (
6b00: 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29 20  except pExcept) 
6b10: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
6b20: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69  .** the table wi
6b30: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
6b40: 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65  ot.  "Saving the
6b50: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
6b60: 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  " means that.** 
6b70: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  the location in 
6b80: 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65 6d  the btree is rem
6b90: 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68 20  embered in such 
6ba0: 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63 61  a way that it ca
6bb0: 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61  n be.** moved ba
6bc0: 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ck to the same s
6bd0: 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62 74  pot after the bt
6be0: 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ree has been mod
6bf0: 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  ified.  This.** 
6c00: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6c10: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
6c20: 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73 20  rsor pExcept is 
6c30: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
6c40: 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72  he.** table, for
6c50: 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65   example in Btre
6c60: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
6c70: 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a  eeInsert()..**.*
6c80: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74  * If there are t
6c90: 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f  wo or more curso
6ca0: 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  rs on the same b
6cb0: 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73  tree, then all s
6cc0: 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20  uch .** cursors 
6cd0: 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69  should have thei
6ce0: 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  r BTCF_Multiple 
6cf0: 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20 62  flag set.  The b
6d00: 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20  treeCursor().** 
6d10: 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73  routine enforces
6d20: 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69   that rule.  Thi
6d30: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e  s routine only n
6d40: 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65  eeds to be calle
6d50: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f  d in.** the unco
6d60: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70  mmon case when p
6d70: 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20 42  Expect has the B
6d80: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
6d90: 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  g set..**.** If 
6da0: 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e  pExpect!=NULL an
6db0: 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75  d if no other cu
6dc0: 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20  rsors are found 
6dd0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  on the same root
6de0: 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74  -page,.** then t
6df0: 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
6e00: 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74   flag on pExpect
6e10: 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20   is cleared, to 
6e20: 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a  avoid another.**
6e30: 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20   pointless call 
6e40: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  to this routine.
6e50: 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  .**.** Implement
6e60: 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69  ation note:  Thi
6e70: 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79  s routine merely
6e80: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
6e90: 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a  f any cursors.**
6ea0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
6eb0: 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74  d.  It calls out
6ec0: 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f   to saveCursorsO
6ed0: 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20 28  nList() in the (
6ee0: 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e  unusual).** even
6ef0: 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20 61  t that cursors a
6f00: 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65  re in need to be
6f10: 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74  ing saved..*/.st
6f20: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
6f30: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
6f40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
6f50: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
6f60: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
6f70: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
6f80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6f90: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6fa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
6fb0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
6fc0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
6fd0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
6fe0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
6ff0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
7000: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
7010: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
7020: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72  oot==iRoot) ) br
7030: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
7040: 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43 75   ) return saveCu
7050: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
7060: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a  Root, pExcept);.
7070: 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29 20    if( pExcept ) 
7080: 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67  pExcept->curFlag
7090: 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69  s &= ~BTCF_Multi
70a0: 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ple;.  return SQ
70b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
70c0: 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69  his helper routi
70d0: 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72  ne to saveAllCur
70e0: 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61 63  sors does the ac
70f0: 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76  tual work of sav
7100: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  ing.** the curso
7110: 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61  rs if and when a
7120: 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64   cursor is found
7130: 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72   that actually r
7140: 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a  equires saving..
7150: 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  ** The common ca
7160: 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75  se is that no cu
7170: 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65  rsors need to be
7180: 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20   saved, so this 
7190: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72  routine is.** br
71a0: 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74  oken out from it
71b0: 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69  s caller to avoi
71c0: 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74  d unnecessary st
71d0: 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65  ack pointer move
71e0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
71f0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
7200: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
7210: 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f  nList(.  BtCurso
7220: 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a  r *p,         /*
7230: 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   The first curso
7240: 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61 76  r that needs sav
7250: 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52  ing */.  Pgno iR
7260: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  oot,          /*
7270: 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f   Only save curso
7280: 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f  r with this iRoo
7290: 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a  t. Save all if z
72a0: 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ero */.  BtCurso
72b0: 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a  r *pExcept    /*
72c0: 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69   Do not save thi
72d0: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  s cursor */.){. 
72e0: 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d   do{.    if( p!=
72f0: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
7300: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
7310: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20  oot==iRoot) ){. 
7320: 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
7330: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7340: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
7350: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
7360: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  {.        int rc
7370: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
7380: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
7390: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
73a0: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =rc ){.         
73b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
73c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
73d0: 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e{.        testc
73e0: 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20  ase( p->iPage>0 
73f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  );.        btree
7400: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
7410: 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20  Pages(p);.      
7420: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  }.    }.    p = 
7430: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69  p->pNext;.  }whi
7440: 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72  le( p );.  retur
7450: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7460: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
7470: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
7480: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
7490: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
74a0: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
74b0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
74c0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
74d0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
74e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
74f0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
7500: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
7510: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
7520: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
7530: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
7540: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
7550: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
7560: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
7570: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
7580: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
7590: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
75a0: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
75b0: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
75c0: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
75d0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
75e0: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
75f0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
7600: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
7610: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7620: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
7630: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
7640: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
7650: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
7660: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
7670: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
7680: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
7690: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
76a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
76b0: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
76c0: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
76d0: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
76e0: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
76f0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
7700: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
7710: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
7720: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
7730: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
7740: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
7750: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7770: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
7780: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
7790: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
77a0: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
77b0: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
77c0: 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20  ace[200];       
77d0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
77e0: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
77f0: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
7800: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
7810: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
7820: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
7830: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
7840: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
7850: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
7860: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
7870: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
7880: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
7890: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
78a0: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
78b0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
78c0: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
78d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
78e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
78f0: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
7900: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
7910: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
7920: 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70  xKey);.    if( p
7930: 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d  IdxKey->nField==
7940: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
7950: 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70  e3DbFree(pCur->p
7960: 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72  KeyInfo->db, pFr
7970: 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ee);.      retur
7980: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7990: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
79a0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
79b0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
79c0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
79d0: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
79e0: 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
79f0: 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20  , bias, pRes);. 
7a00: 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
7a10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7a20: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
7a30: 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a  db, pFree);.  }.
7a40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7a50: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
7a60: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
7a70: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
7a80: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
7a90: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
7aa0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
7ab0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
7ac0: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
7ad0: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
7ae0: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
7af0: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
7b00: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
7b10: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
7b20: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
7b30: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
7b40: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
7b50: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7b60: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
7b70: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
7b80: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73  Position()..*/.s
7b90: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
7ba0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7bb0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
7bc0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
7bd0: 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a    int skipNext;.
7be0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
7bf0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
7c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
7c10: 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
7c20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
7c30: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
7c40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
7c50: 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
7c60: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
7c70: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
7c80: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
7c90: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72  ALID;.  rc = btr
7ca0: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
7cb0: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
7cc0: 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e  >nKey, 0, &skipN
7cd0: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
7ce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7cf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
7d00: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
7d10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
7d20: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
7d30: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
7d40: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
7d50: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
7d60: 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43 75  VALID );.    pCu
7d70: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73  r->skipNext |= s
7d80: 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  kipNext;.    if(
7d90: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
7da0: 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
7db0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
7dc0: 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
7dd0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49  ate = CURSOR_SKI
7de0: 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  PNEXT;.    }.  }
7df0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7e00: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
7e10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7e20: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
7e30: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
7e40: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
7e50: 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75    btreeRestoreCu
7e60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
7e70: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
7e80: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
7e90: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
7ea0: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
7eb0: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
7ec0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65  the position whe
7ed0: 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73  re.** it was las
7ee0: 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73  t placed, or has
7ef0: 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65   been invalidate
7f00: 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  d for any other 
7f10: 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f  reason..** Curso
7f20: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
7f30: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
7f40: 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73  e pointing at is
7f50: 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20   deleted out.** 
7f60: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c  from under them,
7f70: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43   for example.  C
7f80: 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f  ursor might also
7f90: 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65 65   move if a btree
7fa0: 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65  .** is rebalance
7fb0: 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  d..**.** Calling
7fc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
7fd0: 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72  th a NULL cursor
7fe0: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73   pointer returns
7ff0: 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73   false..**.** Us
8000: 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20 73  e the separate s
8010: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
8020: 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69  rRestore() routi
8030: 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  ne to restore a 
8040: 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74  cursor.** back t
8050: 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68 74  o where it ought
8060: 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20 72   to be if this r
8070: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
8080: 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rue..*/.int sqli
8090: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
80a0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
80b0: 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
80c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
80d0: 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a  URSOR_VALID;.}..
80e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
80f0: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
8100: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
8110: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
8120: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
8130: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
8140: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
8150: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
8160: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
8170: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
8180: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
8190: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
81a0: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
81b0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
81c0: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
81d0: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
81e0: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
81f0: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
8200: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
8210: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
8220: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
8230: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
8240: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
8250: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
8260: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
8270: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
8280: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
8290: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
82a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
82b0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
82c0: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
82d0: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
82e0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
82f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
8300: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
8310: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
8320: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
8330: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
8340: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
8350: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
8360: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
8370: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
8380: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
8390: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
83a0: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
83b0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
83c0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
83d0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
83e0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
83f0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
8400: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
8410: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
8420: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
8430: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
8440: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
8450: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
8460: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
8470: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
8480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8490: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
84a0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
84b0: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
84c0: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
84d0: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
84e0: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
84f0: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
8500: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
8510: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
8520: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
8530: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
8540: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
8550: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
8560: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
8570: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
8580: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
8590: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
85a0: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
85b0: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
85c0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
85d0: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
85e0: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
85f0: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
8600: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
8610: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
8620: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
8630: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
8640: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
8650: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
8660: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8670: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8680: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
8690: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
86a0: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
86b0: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
86c0: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
86d0: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
86e0: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
86f0: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
8700: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
8710: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
8720: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
8730: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
8740: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
8750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8760: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
8770: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
8780: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
8790: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
87a0: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
87b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
87c0: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
87d0: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
87e0: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
87f0: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
8800: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
8810: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
8820: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
8830: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
8840: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
8850: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
8860: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
8870: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
8880: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
8890: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
88a0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
88b0: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
88c0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
88d0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
88e0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
88f0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
8900: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
8910: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
8920: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8930: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
8940: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
8950: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8960: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
8970: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
8980: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8990: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
89a0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
89b0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
89c0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
89d0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
89e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
89f0: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
8a00: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
8a10: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
8a20: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
8a30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8a40: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8a50: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
8a60: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
8a70: 6d 62 65 72 20 69 73 20 6e 65 76 65 72 20 61 64  mber is never ad
8a80: 64 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ded to a pointer
8a90: 2d 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61  -map page */.  a
8aa0: 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50  ssert( 0==PTRMAP
8ab0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e  _ISPAGE(pBt, PEN
8ac0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
8ad0: 42 74 29 29 20 29 3b 0a 0a 23 69 66 64 65 66 20  Bt)) );..#ifdef 
8ae0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
8af0: 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 70  NCURRENT.  if( p
8b00: 42 74 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20  Bt->pMap ){.    
8b10: 2a 70 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d  *pRC = btreePtrm
8b20: 61 70 53 74 6f 72 65 28 70 42 74 2c 20 6b 65 79  apStore(pBt, key
8b30: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
8b40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8b50: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
8b60: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
8b70: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
8b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
8b90: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
8ba0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
8bb0: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
8bc0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
8bd0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
8be0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
8bf0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
8c00: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
8c10: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
8c20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
8c30: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
8c40: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
8c50: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
8c60: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
8c70: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
8c80: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
8c90: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
8ca0: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
8cb0: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
8cc0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
8cd0: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
8ce0: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
8cf0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
8d00: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
8d10: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
8d20: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
8d30: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
8d40: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
8d50: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
8d60: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
8d70: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
8d80: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
8d90: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
8da0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
8db0: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
8dc0: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
8dd0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
8de0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8df0: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
8e00: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
8e10: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
8e20: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
8e30: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
8e40: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
8e50: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8e60: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
8e70: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
8e80: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
8e90: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
8ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
8eb0: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
8ec0: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
8ed0: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
8ee0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
8ef0: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
8f00: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
8f10: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
8f20: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
8f30: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
8f40: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
8f50: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
8f60: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
8f70: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
8f80: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
8f90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
8fa0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
8fb0: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
8fc0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
8fd0: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
8fe0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8ff0: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
9000: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
9010: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
9020: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
9030: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
9040: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
9050: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
9060: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
9070: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
9080: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
9090: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
90a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
90b0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
90c0: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
90d0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
90e0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
90f0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9100: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
9110: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
9120: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
9130: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
9140: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
9150: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
9160: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
9170: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
9180: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
9190: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
91a0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
91b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
91c0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
91d0: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
91e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
91f0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
9200: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
9210: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
9220: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
9230: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
9240: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
9250: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
9260: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
9270: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
9280: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
9290: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
92a0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
92b0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
92c0: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
92d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
92e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
92f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9300: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
9310: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
9320: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
9330: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
9340: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
9350: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
9360: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
9370: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
9380: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9390: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
93a0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
93b0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
93c0: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
93d0: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
93e0: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
93f0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
9400: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
9410: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
9420: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
9430: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
9440: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
9450: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
9460: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
9470: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
9480: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
9490: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
94a0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
94b0: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
94c0: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
94d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
94e0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
94f0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
9500: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
9510: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
9520: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
9530: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
9540: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
9550: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
9560: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
9570: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
9580: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
9590: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
95a0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
95b0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
95c0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
95d0: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
95e0: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
95f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
9600: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
9610: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
9620: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
9630: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
9640: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
9650: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
9660: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
9670: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
9680: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
9690: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
96a0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
96b0: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
96c0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
96d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
96e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
96f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9700: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9710: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
9720: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9730: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9740: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9750: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9760: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9770: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9780: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9790: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
97a0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
97b0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
97c0: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
97d0: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
97e0: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
97f0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9800: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
9810: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
9820: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
9830: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
9840: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
9850: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
9860: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
9870: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
9880: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
9890: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
98a0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
98b0: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
98c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
98d0: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
98e0: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
98f0: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
9900: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
9910: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
9920: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
9930: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
9940: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
9950: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
9960: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
9970: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
9980: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
9990: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
99a0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
99b0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
99c0: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
99d0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
99e0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
99f0: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
9a00: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
9a10: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
9a20: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
9a30: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
9a40: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
9a50: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
9a60: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
9a70: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
9a80: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
9a90: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
9aa0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
9ab0: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
9ac0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9ad0: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
9ae0: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
9af0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
9b00: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
9b10: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
9b20: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
9b30: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
9b40: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9b50: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
9b60: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
9b70: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
9b80: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
9b90: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
9ba0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
9bb0: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
9bc0: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  al] - pCell);.  
9bd0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
9be0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
9bf0: 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 4;.}../*.** Th
9c00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
9c10: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
9c20: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
9c30: 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65  MemPage.xParseCe
9c40: 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  ll().** method..
9c50: 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  **.** Parse a ce
9c60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
9c70: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
9c80: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
9c90: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65  ure..**.** btree
9ca0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20  ParseCellPtr()  
9cb0: 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65        =>   table
9cc0: 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65   btree leaf node
9cd0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
9ce0: 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  ellNoPayload()  
9cf0: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
9d00: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a   internal nodes.
9d10: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9d20: 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e  lPtrIndex()   =>
9d30: 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e     index btree n
9d40: 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  odes.**.** There
9d50: 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70   is also a wrapp
9d60: 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65  er function btre
9d70: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61  eParseCell() tha
9d80: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61  t works for.** a
9d90: 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73  ll MemPage types
9da0: 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72 65   and that refere
9db0: 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79  nces the cell by
9dc0: 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74 68   index rather th
9dd0: 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72  an.** by pointer
9de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9df0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9e00: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d  trNoPayload(.  M
9e10: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9e20: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9e30: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9e40: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9e50: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9e60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9e70: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9e80: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9e90: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9ea0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9eb0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ure */.){.  asse
9ec0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9ed0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9ee0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9ef0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9f00: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
9f10: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
9f20: 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oad );.  assert(
9f30: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9f40: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9f50: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9f60: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9f70: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9f80: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
9f90: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
9fa0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
9fb0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9fc0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9fd0: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9fe0: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9ff0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
a000: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
a010: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
a020: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
a030: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
a040: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
a050: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a060: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a070: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a080: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
a090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a0a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
a0b0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
a0c0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
a0d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
a0e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a0f0: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a110: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
a120: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
a130: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
a140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a150: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
a160: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
a170: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
a180: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
a190: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
a1a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
a1b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a1c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a1d0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a1e0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
a1f0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
a200: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
a210: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
a220: 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79   || pPage->noPay
a230: 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74  load );.  assert
a240: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
a250: 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ad==0 );.  asser
a260: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
a270: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
a280: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
a290: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
a2a0: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
a2b0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
a2c0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
a2d0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
a2e0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
a2f0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
a300: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
a310: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
a320: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
a330: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
a340: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
a350: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
a360: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
a370: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
a380: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
a390: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
a3a0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
a3b0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
a3c0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
a3d0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
a3e0: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
a3f0: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
a400: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
a410: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
a420: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
a430: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
a440: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
a450: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
a460: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
a470: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
a480: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
a490: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
a4a0: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
a4b0: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
a4c0: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
a4d0: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
a4e0: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
a4f0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
a500: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
a510: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
a520: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
a530: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
a540: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
a550: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
a560: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
a570: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
a580: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
a590: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
a5a0: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
a5b0: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
a5c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a5d0: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
a5e0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
a5f0: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
a600: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
a610: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
a620: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
a630: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
a640: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a650: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a660: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
a670: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
a680: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
a690: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
a6a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a6b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
a6c0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
a6d0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
a6e0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
a6f0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
a700: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
a710: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
a720: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
a730: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
a740: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
a750: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
a760: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
a770: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
a780: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
a790: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
a7a0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
a7b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
a7c0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
a7d0: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
a7e0: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
a7f0: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
a800: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
a810: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
a820: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
a830: 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65  llPtrIndex(.  Me
a840: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
a850: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
a860: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
a870: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
a880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a890: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
a8a0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
a8b0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
a8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
a8d0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
a8e0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
a8f0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
a900: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
a910: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
a920: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
a930: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
a940: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a950: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
a960: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
a970: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a980: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a990: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
a9a0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
a9b0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
a9c0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
a9d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
a9e0: 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  f==0 );.  assert
a9f0: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
aa00: 61 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  ad==0 );.  pIter
aa10: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
aa20: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
aa30: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
aa40: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
aa50: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
aa60: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
aa70: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
aa80: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
aa90: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
aaa0: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
aab0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
aac0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
aad0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
aae0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
aaf0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
ab00: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
ab10: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
ab20: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
ab30: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
ab40: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
ab50: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
ab60: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
ab70: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
ab80: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
ab90: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
aba0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
abb0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
abc0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
abd0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
abe0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
abf0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
ac00: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
ac10: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
ac20: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
ac30: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
ac40: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
ac50: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
ac60: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
ac70: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
ac80: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
ac90: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
aca0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
acb0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
acc0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
acd0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
ace0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
acf0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
ad00: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
ad10: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
ad20: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
ad30: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
ad40: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
ad50: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
ad60: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
ad70: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
ad80: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
ad90: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
ada0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
adb0: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
adc0: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
add0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
ade0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
adf0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
ae00: 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78  */.){.  pPage->x
ae10: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
ae20: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
ae30: 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b   iCell), pInfo);
ae40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
ae50: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
ae60: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
ae70: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
ae80: 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a  age.xCellSize.**
ae90: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43   method..**.** C
aea0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
aeb0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
aec0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
aed0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
aee0: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
aef0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
af00: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
af10: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
af20: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
af30: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
af40: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
af50: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
af60: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
af70: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
af80: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  cell pointer..**
af90: 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  .** cellSizePtrN
afa0: 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e  oPayload()    =>
afb0: 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61     table interna
afc0: 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53  l nodes.** cellS
afd0: 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20  izePtr()        
afe0: 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e       =>   all in
aff0: 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c  dex nodes & tabl
b000: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a  e leaf nodes.*/.
b010: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
b020: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
b030: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
b040: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
b050: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
b060: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
b070: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
b080: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
b090: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b0c0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b0d0: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
b0e0: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
b110: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
b120: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b130: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
b140: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b150: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
b160: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
b170: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
b180: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
b190: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
b1a0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
b1b0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
b1c0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
b1d0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
b1e0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
b1f0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
b200: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
b210: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
b220: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
b230: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
b240: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
b250: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
b260: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
b270: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
b280: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
b290: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
b2a0: 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d  age->noPayload==
b2b0: 30 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a  0 );.  nSize = *
b2c0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69  pIter;.  if( nSi
b2d0: 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ze>=0x80 ){.    
b2e0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
b2f0: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30  ;.    nSize &= 0
b300: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
b310: 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a     nSize = (nSiz
b320: 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  e<<7) | (*++pIte
b330: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
b340: 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e  while( *(pIter)>
b350: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
b360: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
b370: 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67  er++;.  if( pPag
b380: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
b390: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
b3a0: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
b3b0: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
b3c0: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
b3d0: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
b3e0: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
b3f0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
b400: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
b410: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
b420: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
b430: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
b440: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
b450: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
b460: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
b470: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
b480: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
b490: 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e   }.  testcase( n
b4a0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
b4b0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
b4c0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
b4d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
b4e0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50  .  if( nSize<=pP
b4f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
b500: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75  .    nSize += (u
b510: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
b520: 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  l);.    if( nSiz
b530: 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b  e<4 ) nSize = 4;
b540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
b550: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
b560: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
b570: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
b580: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
b590: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
b5a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b5b0: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
b5c0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
b5d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
b5e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
b5f0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
b600: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
b610: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
b620: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
b630: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
b640: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
b650: 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28  ze += 4 + (u16)(
b660: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
b670: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53    }.  assert( nS
b680: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
b690: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
b6a0: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
b6b0: 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61  u16)nSize;.}.sta
b6c0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
b6d0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d  PtrNoPayload(Mem
b6e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
b6f0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
b700: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34  Iter = pCell + 4
b710: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
b720: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
b730: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
b740: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
b750: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
b760: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69   a varint */..#i
b770: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
b780: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
b790: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
b7a0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
b7b0: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
b7c0: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
b7d0: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
b7e0: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
b7f0: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
b800: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
b810: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
b820: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
b830: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
b840: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
b850: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
b860: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
b870: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
b880: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
b890: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
b8a0: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
b8b0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
b8c0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
b8d0: 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  ginfo);.#else.  
b8e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
b8f0: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
b900: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b910: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
b920: 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49  4 );.  pEnd = pI
b930: 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65  ter + 9;.  while
b940: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
b950: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
b960: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 62  );.  assert( deb
b970: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75  uginfo.nSize==(u
b980: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
b990: 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
b9a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b9b0: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
b9c0: 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  );.}...#ifdef SQ
b9d0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
b9e0: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
b9f0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
ba00: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
ba10: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
ba20: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
ba30: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
ba40: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
ba50: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
ba60: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
ba70: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
ba80: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
ba90: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
baa0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
bab0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
bac0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
bad0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
bae0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
baf0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
bb00: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
bb10: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
bb20: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
bb30: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
bb40: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
bb50: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
bb60: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
bb70: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
bb80: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
bb90: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
bba0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
bbb0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
bbc0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
bbd0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61  Cell!=0 );.  pPa
bbe0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
bbf0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
bc00: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
bc10: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
bc20: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
bc30: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
bc40: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
bc50: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
bc60: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
bc70: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
bc80: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
bc90: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
bca0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
bcb0: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
bcc0: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
bcd0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
bce0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
bcf0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
bd00: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
bd10: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
bd20: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
bd30: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
bd40: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
bd50: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
bd60: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
bd70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
bd80: 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45  ..**.** EVIDENCE
bd90: 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31  -OF: R-44582-601
bda0: 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72  38 SQLite may fr
bdb0: 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20  om time to time 
bdc0: 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20  reorganize a.** 
bdd0: 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74  b-tree page so t
bde0: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
bdf0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66   freeblocks or f
be00: 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61  ragment bytes, a
be10: 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74  ll.** unused byt
be20: 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  es are contained
be30: 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61   in the unalloca
be40: 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e  ted space region
be50: 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c  , and all.** cel
be60: 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69  ls are packed ti
be70: 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64  ghtly at the end
be80: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
be90: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
bea0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
beb0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
bec0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
bed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bee0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
bef0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
bf00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
bf10: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
bf20: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
bf30: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bf40: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
bf50: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
bf60: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
bf90: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
bfa0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
bfb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bfc0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
bfd0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
bfe0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
bff0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
c000: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
c010: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
c020: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
c030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c040: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
c050: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
c060: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c080: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
c090: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
c0a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c0b0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
c0c0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
c0d0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
c0e0: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
c0f0: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
c100: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
c110: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c120: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
c130: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
c140: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
c150: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
c160: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
c170: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
c180: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
c190: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
c1a0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
c1b0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
c1c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c1d0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c1e0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c1f0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c200: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
c210: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c220: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c230: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
c240: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
c250: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
c260: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
c270: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c280: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
c290: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
c2a0: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
c2b0: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
c2c0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
c2d0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c2e0: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
c2f0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
c300: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
c310: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
c320: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
c330: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c340: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
c350: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
c360: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
c370: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
c380: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ize;.  iCellFirs
c390: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
c3a0: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c   2*nCell;.  iCel
c3b0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c3c0: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c3d0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c3e0: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c3f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c400: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c410: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c420: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c430: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c440: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c450: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c460: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c470: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c480: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c490: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c4a0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c4b0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c4c0: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c4d0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c4e0: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c4f0: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c500: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c510: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c520: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c540: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c550: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  }.    assert( pc
c560: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20  >=iCellFirst && 
c570: 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc<=iCellLast );
c580: 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67  .    size = pPag
c590: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
c5a0: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
c5b0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
c5c0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
c5d0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
c5e0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c5f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c600: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c610: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
c620: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
c630: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
c640: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
c650: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c660: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
c670: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
c680: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
c690: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
c6a0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
c6b0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66  r, cbrk);.    if
c6c0: 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( temp==0 ){.   
c6d0: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
c6e0: 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63  if( cbrk==pc ) c
c6f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74  ontinue;.      t
c700: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
c710: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
c720: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
c730: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
c740: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c750: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
c760: 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b  &temp[x], &data[
c770: 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20  x], (cbrk+size) 
c780: 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20  - x);.      src 
c790: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20  = temp;.    }.  
c7a0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
c7b0: 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20  brk], &src[pc], 
c7c0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73  size);.  }.  ass
c7d0: 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  ert( cbrk>=iCell
c7e0: 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62  First );.  put2b
c7f0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c800: 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  , cbrk);.  data[
c810: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
c820: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
c830: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c840: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
c850: 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c  [iCellFirst], 0,
c860: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
c870: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c880: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
c890: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
c8a0: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62  age) );.  if( cb
c8b0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
c8c0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
c8d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c8e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c8f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c900: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c910: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d  Search the free-
c920: 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67  list on page pPg
c930: 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74   for space to st
c940: 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65  ore a cell nByte
c950: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
c960: 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65  e. If one can be
c970: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61   found, return a
c980: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c990: 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65  space and remove
c9a0: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
c9b0: 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
c9c0: 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
c9d0: 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75  space can be fou
c9e0: 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  nd on the free-l
c9f0: 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ist, return NULL
ca00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
ca10: 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74  ction may detect
ca20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68   corruption with
ca30: 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72  in pPg.  If corr
ca40: 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  uption is.** det
ca50: 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20  ected then *pRc 
ca60: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
ca70: 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c  _CORRUPT and NUL
ca80: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
ca90: 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68  *.** Slots on th
caa0: 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74  e free list that
cab0: 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61   are between 1 a
cac0: 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65  nd 3 bytes large
cad0: 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20  r than nByte.** 
cae0: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
caf0: 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78  if adding the ex
cb00: 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65  tra space to the
cb10: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
cb20: 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74  ount.** causes t
cb30: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
cb40: 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64   count to exceed
cb50: 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75   60..*/.static u
cb60: 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  8 *pageFindSlot(
cb70: 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  MemPage *pPg, in
cb80: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52  t nByte, int *pR
cb90: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  c){.  const int 
cba0: 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
cbb0: 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  fset;.  u8 * con
cbc0: 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
cbd0: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64  aData;.  int iAd
cbe0: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
cbf0: 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
cc00: 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29  e(&aData[iAddr])
cc10: 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74  ;.  int x;.  int
cc20: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
cc30: 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
cc40: 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ze;..  assert( p
cc50: 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  c>0 );.  do{.   
cc60: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
cc70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cc80: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
cc90: 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  /.    /* EVIDENC
cca0: 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39  E-OF: R-06866-39
ccb0: 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61  125 Freeblocks a
ccc0: 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63  re always connec
ccd0: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a  ted in order of.
cce0: 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e      ** increasin
ccf0: 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20  g offset. */.   
cd00: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
cd10: 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72  ze-4 || pc<iAddr
cd20: 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  +4 ){.      *pRc
cd30: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
cd40: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
cd50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
cd60: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
cd70: 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20  : R-22710-53328 
cd80: 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f  The third and fo
cd90: 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61  urth bytes of ea
cda0: 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  ch.    ** freebl
cdb0: 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65  ock form a big-e
cdc0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
cdd0: 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20  ich is the size 
cde0: 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  of the freeblock
cdf0: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73  .    ** in bytes
ce00: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
ce10: 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a  4-byte header. *
ce20: 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74  /.    size = get
ce30: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
ce40: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20  2]);.    if( (x 
ce50: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e  = size - nByte)>
ce60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
ce70: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
ce80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
ce90: 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
cea0: 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66  pc < pPg->cellOf
ceb0: 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c  fset+2*pPg->nCel
cec0: 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75  l || size+pc > u
ced0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
cee0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
cef0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cf00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cf10: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
cf20: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
cf30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
cf40: 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20  : R-11498-58022 
cf50: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
cf60: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
cf70: 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20  e total.        
cf80: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
cf90: 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20  es in fragments 
cfa0: 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36  may not exceed 6
cfb0: 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  0. */.        if
cfc0: 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35  ( aData[hdr+7]>5
cfd0: 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  7 ) return 0;.. 
cfe0: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
cff0: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
d000: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
d010: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
d020: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
d030: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
d040: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
d050: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
d060: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
d070: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
d080: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
d090: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
d0a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d0b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
d0c0: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
d0d0: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
d0e0: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
d0f0: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a  count.         *
d100: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
d110: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
d120: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
d130: 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74  .        put2byt
d140: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20  e(&aData[pc+2], 
d150: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
d160: 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b    return &aData[
d170: 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20  pc + x];.    }. 
d180: 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20     iAddr = pc;. 
d190: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
d1a0: 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20  (&aData[pc]);.  
d1b0: 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20  }while( pc );.. 
d1c0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d1d0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
d1e0: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
d1f0: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
d200: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
d210: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
d220: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
d230: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
d240: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
d250: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
d260: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
d270: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
d280: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
d290: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
d2a0: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
d2b0: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
d2c0: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
d2d0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
d2e0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
d2f0: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
d300: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
d310: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
d320: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
d330: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
d340: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
d350: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
d360: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
d370: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
d380: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
d390: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
d3a0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
d3b0: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
d3c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
d3d0: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
d3e0: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
d3f0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
d400: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
d410: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
d420: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
d430: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
d440: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
d450: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
d460: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
d470: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
d480: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
d490: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
d4a0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
d4b0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
d4c0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
d4d0: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
d4e0: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
d4f0: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
d500: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
d510: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d520: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
d530: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d560: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
d570: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
d580: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d590: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d5a0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
d5b0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
d5c0: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
d5d0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
d5e0: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
d5f0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
d600: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
d610: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
d620: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
d630: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
d640: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
d650: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
d660: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d670: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
d680: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
d690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
d6a0: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
d6b0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
d6c0: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
d6d0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
d6e0: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
d6f0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
d700: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
d710: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
d720: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
d730: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
d740: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d750: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
d760: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
d770: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
d780: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
d790: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
d7a0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
d7b0: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
d7c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
d7d0: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
d7e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
d7f0: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
d800: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
d810: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
d820: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
d830: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
d840: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
d850: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
d860: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
d870: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
d880: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
d890: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
d8a0: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
d8b0: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
d8c0: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
d8d0: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
d8e0: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
d8f0: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
d900: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
d910: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
d920: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d930: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
d940: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
d950: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d960: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
d970: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
d980: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
d990: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
d9a0: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
d9b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d9c0: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
d9d0: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
d9e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d9f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
da00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
da10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
da20: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
da30: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
da40: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
da50: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
da60: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
da70: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
da80: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
da90: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
daa0: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
dab0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
dac0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
dad0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
dae0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
daf0: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
db00: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
db10: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
db20: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
db30: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
db40: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
db50: 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20  (data[hdr+2] || 
db60: 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20  data[hdr+1]) && 
db70: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
db80: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
db90: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
dba0: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  e, nByte, &rc);.
dbb0: 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29      if( pSpace )
dbc0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dbd0: 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20  pSpace>=data && 
dbe0: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c  (pSpace - data)<
dbf0: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a  65536 );.      *
dc00: 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70  pIdx = (int)(pSp
dc10: 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20  ace - data);.   
dc20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dc30: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
dc40: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
dc50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
dc60: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
dc70: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
dc80: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
dc90: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
dca0: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
dcb0: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
dcc0: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
dcd0: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
dce0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
dcf0: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
dd00: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
dd10: 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  op ){.    assert
dd20: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
dd30: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
dd40: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
dd50: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
dd60: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
dd70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
dd80: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
dd90: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
dda0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
ddb0: 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  ap+nByte<=top );
ddc0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
ddd0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
dde0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
ddf0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
de00: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
de10: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
de20: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
de30: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
de40: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
de50: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
de60: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
de70: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
de80: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
de90: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
dea0: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
deb0: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
dec0: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
ded0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
dee0: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
def0: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
df00: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
df10: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
df20: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
df30: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
df40: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
df50: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
df60: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
df70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
df80: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
df90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dfa0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
dfb0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
dfc0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
dfd0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
dfe0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
dff0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
e000: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
e010: 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74  ge->aData[iStart
e020: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
e030: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
e040: 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  s iSize bytes..*
e050: 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72  *.** Adjacent fr
e060: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61  eeblocks are coa
e070: 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  lesced..**.** No
e080: 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  te that even tho
e090: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
e0a0: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
e0b0: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
e0c0: 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  age(),.** that r
e0d0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
e0e0: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
e0f0: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
e100: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
e110: 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
e120: 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
e130: 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
e140: 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
e150: 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
e160: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e170: 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
e180: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
e190: 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
e1a0: 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
e1b0: 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
e1c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
e1d0: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
e1e0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
e1f0: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
e200: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
e210: 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
e220: 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
e230: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
e260: 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
e270: 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
e280: 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e2a0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
e2b0: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
e2c0: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
e2f0: 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
e300: 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
e310: 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
e340: 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
e350: 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
e360: 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e380: 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
e390: 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33  of iSize */.  u3
e3a0: 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d  2 iLast = pPage-
e3b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
e3c0: 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70  -4; /* Largest p
e3d0: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
e3e0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33  k offset */.  u3
e3f0: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
e400: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
e410: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
e420: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
e430: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
e440: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
e450: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
e460: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
e470: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
e480: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e4a0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
e4b0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
e4c0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e4d0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
e4e0: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
e4f0: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
e500: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
e510: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
e520: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
e530: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
e540: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
e550: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e560: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
e570: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e580: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
e590: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
e5a0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
e5b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
e5c0: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a  tart<=iLast );..
e5d0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
e5e0: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
e5f0: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
e600: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
e610: 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  lete.  ** option
e620: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
e630: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
e640: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
e650: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
e660: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
e670: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
e680: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
e690: 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65  The list of free
e6a0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
e6b0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
e6c0: 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20  r.  Find the .  
e6d0: 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c  ** spot on the l
e6e0: 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74  ist where iStart
e6f0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
e700: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20  ted..  */.  hdr 
e710: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
e720: 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72  et;.  iPtr = hdr
e730: 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61   + 1;.  if( data
e740: 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64  [iPtr+1]==0 && d
e750: 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a  ata[iPtr]==0 ){.
e760: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30      iFreeBlk = 0
e770: 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66  ;  /* Shortcut f
e780: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
e790: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
e7a0: 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73   empty */.  }els
e7b0: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69  e{.    while( (i
e7c0: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
e7d0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29  te(&data[iPtr]))
e7e0: 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69  >0 && iFreeBlk<i
e7f0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
e800: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
e810: 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +4 ) return SQLI
e820: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
e830: 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46  .      iPtr = iF
e840: 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20  reeBlk;.    }.  
e850: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69    if( iFreeBlk>i
e860: 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  Last ) return SQ
e870: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e880: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  T;.    assert( i
e890: 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20  FreeBlk>iPtr || 
e8a0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20  iFreeBlk==0 );. 
e8b0: 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73   .    /* At this
e8c0: 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20   point:.    **  
e8d0: 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69    iFreeBlk:   Fi
e8e0: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66  rst freeblock af
e8f0: 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a  ter iStart, or z
e900: 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20  ero if none.    
e910: 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20  **    iPtr:     
e920: 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66    The address of
e930: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46   a pointer to iF
e940: 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20  reeBlk.    **.  
e950: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
e960: 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68  e if iFreeBlk sh
e970: 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65  ould be coalesce
e980: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
e990: 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f  f iStart..    */
e9a0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
e9b0: 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72  k && iEnd+3>=iFr
e9c0: 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e  eeBlk ){.      n
e9d0: 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20  Frag = iFreeBlk 
e9e0: 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66  - iEnd;.      if
e9f0: 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20  ( iEnd>iFreeBlk 
ea00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ea10: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ea20: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
ea30: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
ea40: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
ea50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  );.      if( iEn
ea60: 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  d > pPage->pBt->
ea70: 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74  usableSize ) ret
ea80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ea90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
eaa0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
eab0: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
eac0: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
ead0: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
eae0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
eaf0: 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
eb00: 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
eb10: 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
eb20: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
eb30: 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
eb40: 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
eb50: 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
eb60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
eb70: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
eb80: 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
eb90: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
eba0: 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
ebb0: 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
ebc0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
ebd0: 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
ebe0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
ebf0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
ec00: 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
ec10: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
ec20: 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
ec30: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ec40: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ec50: 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69        nFrag += i
ec60: 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b  Start - iPtrEnd;
ec70: 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d  .        iSize =
ec80: 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20   iEnd - iPtr;.  
ec90: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
eca0: 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Ptr;.      }.   
ecb0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67   }.    if( nFrag
ecc0: 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72  >data[hdr+7] ) r
ecd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ece0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64  RUPT_BKPT;.    d
ecf0: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
ed00: 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  rag;.  }.  if( i
ed10: 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28  Start==get2byte(
ed20: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b  &data[hdr+5]) ){
ed30: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
ed40: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
ed50: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
ed60: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ed70: 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
ed80: 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
ed90: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
eda0: 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
edb0: 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
edc0: 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
edd0: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
ede0: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
edf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ee00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75  UPT_BKPT;.    pu
ee10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ee20: 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  +1], iFreeBlk);.
ee30: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
ee40: 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29  ta[hdr+5], iEnd)
ee50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ee60: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
ee70: 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20   freeblock into 
ee80: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
ee90: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
eea0: 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74  ta[iPtr], iStart
eeb0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
eec0: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
eed0: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
eee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
eef0: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
ef00: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
ef10: 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
ef20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ef30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
ef40: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
ef50: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
ef60: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
ef70: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
ef80: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
ef90: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
efa0: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
efb0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
efc0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
efd0: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
efe0: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
eff0: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
f000: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
f010: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
f020: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
f030: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
f040: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
f050: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
f060: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
f070: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
f080: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
f090: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
f0a0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
f0b0: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
f0c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
f0d0: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
f0e0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
f0f0: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
f100: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
f110: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
f120: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
f130: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
f140: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
f150: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
f160: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
f170: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f180: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
f190: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
f1a0: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
f1b0: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
f1c0: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
f1d0: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
f1e0: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
f1f0: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
f200: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
f210: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65  e->leaf;.  pPage
f220: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
f230: 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74  llSizePtr;.  pBt
f240: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
f250: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
f260: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
f270: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
f280: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f290: 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20  : R-03640-13415 
f2a0: 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61  A value of 5 mea
f2b0: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
f2c0: 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a  n interior.    *
f2d0: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  * table b-tree p
f2e0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
f2f0: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
f300: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35  A|PTF_INTKEY)==5
f310: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
f320: 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d  NCE-OF: R-20501-
f330: 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66  61796 A value of
f340: 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61   13 means the pa
f350: 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20  ge is a leaf.   
f360: 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65   ** table b-tree
f370: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f380: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
f390: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
f3a0: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
f3b0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f3c0: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
f3d0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f3e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f3f0: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
f400: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
f410: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
f420: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f430: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f440: 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  tr;.    }else{. 
f450: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
f460: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
f470: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
f480: 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  ad = 1;.      pP
f490: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
f4a0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
f4b0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
f4c0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f4d0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f4e0: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
f4f0: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
f500: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
f510: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
f520: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f530: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
f540: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
f550: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
f560: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f570: 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33 39  -OF: R-27225-539
f580: 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  36 A value of 2 
f590: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f5a0: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
f5b0: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
f5c0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f5d0: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
f5e0: 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20  DATA)==2 );.    
f5f0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f600: 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41 20  R-16571-11615 A 
f610: 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61 6e  value of 10 mean
f620: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  s the page is a 
f630: 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65  leaf.    ** inde
f640: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f650: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f660: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
f670: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
f680: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f690: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
f6a0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f6b0: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
f6c0: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  oad = 0;.    pPa
f6d0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f6e0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f6f0: 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61  trIndex;.    pPa
f700: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
f710: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
f720: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
f730: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
f740: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
f750: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f760: 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e  R-47608-56469 An
f770: 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f  y other value fo
f780: 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  r the b-tree pag
f790: 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a  e type is.    **
f7a0: 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
f7b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f7c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f7d0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
f7e0: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
f7f0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
f800: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
f810: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f820: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
f830: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
f840: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
f850: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
f860: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
f870: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
f880: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
f890: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
f8a0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
f8b0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f8c0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
f8d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
f8e0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
f8f0: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
f900: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
f910: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
f920: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
f930: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
f940: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
f950: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
f960: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
f970: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
f980: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
f990: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
f9a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
f9b0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
f9c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
f9d0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
f9e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f9f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fa00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fa10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fa20: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
fa30: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
fa40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
fa50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
fa60: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
fa70: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
fa80: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fa90: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
faa0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
fab0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
fac0: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
fad0: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
fae0: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fb00: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
fb10: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
fb20: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
fb30: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
fb40: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
fb50: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
fb60: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
fb70: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
fb80: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
fb90: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
fba0: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
fbb0: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
fbc0: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
fbd0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69  ructure */.    i
fbe0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
fbf0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
fc00: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
fc10: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
fc20: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
fc30: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
fc40: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
fc50: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
fc60: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  inter */.    int
fc70: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
fc80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
fc90: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
fca0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
fcb0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
fcc0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
fcd0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
fce0: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
fcf0: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
fd00: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
fd10: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
fd20: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
fd30: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
fd40: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
fd50: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
fd60: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
fd70: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
fd80: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
fd90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
fda0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
fdb0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
fdc0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
fdd0: 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
fde0: 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
fdf0: 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
fe00: 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20   indicating.    
fe10: 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
fe20: 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20  ge type. */.    
fe30: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
fe40: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
fe50: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
fe60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
fe70: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
fe80: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
fe90: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
fea0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
feb0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
fec0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
fed0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
fee0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
fef0: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
ff00: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
ff10: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
ff20: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
ff30: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
ff40: 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
ff50: 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50  dPtrSize;.    pP
ff60: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
ff70: 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
ff80: 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43  ];.    pPage->aC
ff90: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
ffa0: 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ellOffset];.    
ffb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
ffc0: 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
ffd0: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
ffe0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
fff0: 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35  F: R-58015-48175
10000 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10010 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10020 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20  5 designates.   
10030 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
10040 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10050 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
10060 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
10070 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  teger is.    ** 
10080 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36  interpreted as 6
10090 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70  5536. */.    top
100a0 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
100b0 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
100c0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
100d0 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32  E-OF: R-37002-32
100e0 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65  774 The two-byte
100f0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
10100 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20  et 3 gives the. 
10110 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
10120 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
10130 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d  e. */.    pPage-
10140 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
10150 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
10160 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
10170 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
10180 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
10190 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
101a0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
101b0 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
101c0 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
101d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
101e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
101f0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
10200 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
10210 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
10220 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10230 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
10240 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
10250 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
10260 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
10270 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
10280 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
10290 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
102a0 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
102b0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
102c0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
102d0 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
102e0 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
102f0 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
10300 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20  he.    ** bytes 
10310 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
10320 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
10330 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
10340 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53   || top==usableS
10350 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
10360 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  B );..    /* A m
10370 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
10380 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
10390 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
103a0 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
103b0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
103c0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
103d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
103e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
103f0 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
10400 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
10410 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
10420 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
10430 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
10440 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
10450 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
10460 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
10470 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
10480 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
10490 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
104a0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
104b0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
104c0 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
104d0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66  Size - 4;.    if
104e0 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
104f0 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
10500 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e  zeCk ){.      in
10510 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10520 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
10530 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
10540 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
10550 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
10560 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
10570 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
10580 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
10590 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
105a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
105b0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
105c0 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
105d0 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
105e0 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
105f0 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
10600 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
10610 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
10620 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10630 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
10640 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10650 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10660 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10680 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
106a0 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
106b0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
106c0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
106d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
106e0 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
106f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
10700 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
10710 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
10720 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10730 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
10740 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10750 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
10760 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
10770 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20      }  ..    /* 
10780 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
10790 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
107a0 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
107b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
107c0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
107d0 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
107e0 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
107f0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
10800 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
10810 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
10820 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
10830 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
10840 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  o.    ** freeblo
10850 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d  cks. */.    pc =
10860 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10870 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
10880 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
10890 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
108a0 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
108b0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
108c0 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ce */.    while(
108d0 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
108e0 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
108f0 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10900 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10910 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10920 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10930 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
10940 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
10950 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
10960 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  ere will.       
10970 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
10980 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
10990 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
109a0 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
109b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
109c0 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c  * Or, the freebl
109d0 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65  ock is off the e
109e0 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  nd of the page. 
109f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10a10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
10a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
10a30 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
10a40 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
10a50 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
10a60 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
10a70 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
10a80 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
10a90 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
10aa0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
10ab0 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
10ac0 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
10ad0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
10ae0 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
10af0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
10b00 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
10b10 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
10b20 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
10b30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10b40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10b50 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
10b60 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
10b70 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
10b80 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
10b90 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
10ba0 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
10bb0 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
10bc0 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
10bd0 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
10be0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10bf0 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
10c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
10c10 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
10c20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
10c30 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
10c40 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
10c50 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
10c60 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
10c70 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
10c80 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
10c90 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
10ca0 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
10cb0 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
10cc0 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
10cd0 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
10ce0 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
10cf0 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
10d00 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
10d10 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
10d20 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
10d30 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
10d40 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
10d50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
10d60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10d70 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
10d80 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
10d90 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
10da0 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
10db0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
10dc0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
10dd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10de0 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
10df0 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
10e00 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
10e10 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
10e20 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
10e30 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
10e40 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
10e50 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
10e60 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
10e70 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
10e80 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10e90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10ea0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
10eb0 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
10ec0 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
10ed0 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
10ee0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
10ef0 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
10f00 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
10f10 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
10f20 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10f30 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10f40 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
10f50 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
10f60 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10f70 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
10f80 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
10f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10fa0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
10fb0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
10fc0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10fd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10fe0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10ff0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
11000 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
11010 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
11020 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
11030 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
11040 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
11050 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
11060 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
11070 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
11080 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
11090 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
110a0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
110b0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
110c0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
110d0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
110e0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
110f0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
11100 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
11110 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
11120 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
11130 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
11140 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
11150 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
11160 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
11170 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
11180 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
11190 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
111a0 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
111b0 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  rst];.  pPage->a
111c0 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61  DataOfst = &data
111d0 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
111e0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
111f0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
11200 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
11210 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
11220 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
11230 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
11240 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
11250 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
11260 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
11270 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
11280 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
11290 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
112a0 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
112b0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
112c0 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
112d0 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
112e0 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
112f0 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
11300 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11310 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
11320 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
11330 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11340 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
11350 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
11360 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11370 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
11380 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
11390 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
113a0 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
113b0 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
113c0 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
113d0 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
113e0 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
113f0 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
11400 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
11410 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
11420 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
11430 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
11440 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
11450 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
11460 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
11470 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
11480 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
11490 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72  .  See also: btr
114a0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
114b0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
114c0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
114d0 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ENT flag is set,
114e0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
114f0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a  e do not care.**
11500 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
11510 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
11520 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
11530 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
11540 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
11550 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
11560 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
11570 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
11580 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
11590 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
115a0 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
115b0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
115c0 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
115d0 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
115e0 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
115f0 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
11600 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
11610 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
11620 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
11630 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
11640 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
11650 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11660 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
11670 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
11680 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11690 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
116a0 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
116b0 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
116c0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
116d0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
116e0 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
116f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
11710 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
11720 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
11730 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
11740 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
11750 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
11760 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
11770 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
11780 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20  ET_NOCONTENT || 
11790 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
117a0 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61  _READONLY );.  a
117b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
117c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
117d0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
117e0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
117f0 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
11800 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
11810 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
11820 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
11830 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
11840 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
11850 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11860 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
11890 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
118a0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
118b0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
118c0 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
118d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
118e0 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
118f0 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
11900 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
11910 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
11920 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
11930 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
11940 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
11950 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
11960 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
11970 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
11980 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11990 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
119a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
119b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
119c0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
119d0 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
119e0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
119f0 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
11a00 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
11a10 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
11a20 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
11a30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
11a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11a50 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
11a60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11a70 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
11a80 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
11a90 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
11aa0 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
11ab0 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
11ac0 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
11ad0 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
11ae0 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
11af0 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
11b00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
11b10 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
11b20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11b30 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
11b40 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
11b50 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
11b60 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
11b70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
11b80 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
11b90 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
11ba0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
11bb0 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
11bc0 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
11bd0 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
11be0 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
11bf0 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
11c00 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
11c10 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
11c20 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
11c30 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
11c40 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11c50 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
11c60 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
11c70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
11c80 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
11c90 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
11ca0 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
11cb0 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
11cc0 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
11cd0 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
11ce0 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
11cf0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
11d00 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11d10 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
11d20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
11d30 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
11d40 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
11d50 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
11d60 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
11d70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
11d80 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
11d90 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
11dc0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
11dd0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
11de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11df0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11e00 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
11e10 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
11e30 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
11e40 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
11e50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
11e80 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
11e90 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
11ea0 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11ec0 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
11ed0 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
11ee0 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
11ef0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
11f00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11f10 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11f20 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11f30 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
11f40 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61  age==&pCur->apPa
11f50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
11f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
11f70 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
11f80 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
11f90 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
11fa0 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11fb0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
11fc0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
11fd0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
11fe0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11ff0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12000 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
12010 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
12020 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
12030 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
12040 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
12050 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
12060 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29  Page, bReadOnly)
12070 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
12080 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
12090 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
120a0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
120b0 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
120c0 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
120d0 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  pBt);.  if( (*pp
120e0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
120f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
12100 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
12110 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
12120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12130 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12140 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
12150 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
12160 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  age_error;.    }
12170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  .  }..  /* If ob
12180 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
12190 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
121a0 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
121b0 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
121c0 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
121d0 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
121e0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
121f0 70 43 75 72 0a 20 20 20 26 26 20 28 28 2a 70 70  pCur.   && ((*pp
12200 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  Page)->nCell<1 |
12210 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74  | (*ppPage)->int
12220 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key!=pCur->curIn
12230 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20 72  tKey).  ){.    r
12240 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
12250 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c  PT_BKPT;.    rel
12260 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
12270 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  );.    goto getA
12280 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
122a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e  QLITE_OK;..getAn
122b0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a  dInitPage_error:
122c0 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70 43  .  if( pCur ) pC
122d0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74  ur->iPage--;.  t
122e0 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
122f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
12300 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
12310 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
12320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12330 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
12340 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
12350 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
12360 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
12370 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
12380 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
12390 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
123a0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
123b0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
123c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
123d0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
123e0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
123f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12400 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
12410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12420 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12430 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
12440 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
12450 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12460 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
12470 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
12480 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
12490 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
124a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
124b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
124c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
124d0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
124e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
124f0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
12500 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
12510 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
12520 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
12530 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
12540 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
12550 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
12560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
12570 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
12580 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
12590 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
125a0 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
125b0 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
125c0 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
125d0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
125e0 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
125f0 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
12600 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
12610 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
12620 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
12630 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
12640 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
12650 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
12660 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
12670 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
12680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
12690 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
126a0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
126b0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
126c0 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
126d0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
126e0 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
126f0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
12700 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
12710 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
12720 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
12730 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
12740 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
12750 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
12760 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12770 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
12780 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
12790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
127a0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
127b0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
127c0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
127d0 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
127e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
127f0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
12800 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
12810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12820 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
12830 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
12840 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12850 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
12860 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
12870 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12880 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
12890 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
128a0 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
128b0 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
128c0 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
128d0 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
128e0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
128f0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
12900 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
12910 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
12920 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
12930 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
12940 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12950 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12960 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
12970 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
12980 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
12990 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
129a0 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
129b0 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
129c0 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
129d0 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
129e0 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
129f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12a00 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
12a10 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
12a20 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
12a30 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
12a40 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12a50 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
12a60 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
12a70 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
12a80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12a90 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
12aa0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12ab0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12ac0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
12ad0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12ae0 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
12af0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
12b00 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
12b10 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
12b20 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
12b30 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
12b40 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
12b50 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
12b60 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
12b70 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
12b80 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
12b90 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
12ba0 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
12bb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
12bc0 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
12bd0 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
12be0 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
12bf0 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
12c00 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
12c10 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
12c20 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
12c30 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
12c40 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
12c50 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
12c60 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
12c70 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
12c80 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
12c90 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
12ca0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
12cb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
12cc0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
12cd0 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
12ce0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12cf0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
12d00 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
12d10 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
12d20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
12d30 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
12d40 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
12d50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12d60 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
12d70 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
12d80 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
12d90 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
12da0 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
12db0 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
12dc0 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
12dd0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
12de0 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
12df0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
12e00 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
12e10 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
12e20 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
12e30 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
12e40 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
12e50 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
12e60 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
12e70 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
12e80 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
12e90 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
12ea0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
12eb0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
12ec0 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
12ed0 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
12ee0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
12ef0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
12f00 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
12f10 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
12f20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12f30 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
12f40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
12f50 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
12f60 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
12f70 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
12f80 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
12f90 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
12fa0 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
12fb0 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
12fc0 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
12fd0 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
12fe0 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
12ff0 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
13000 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
13010 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
13020 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
13030 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
13040 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13050 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
13060 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
13070 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
13080 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
13090 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
130a0 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
130b0 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
130c0 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
130d0 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
130e0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
130f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13100 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
13110 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
13120 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
13130 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
13140 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
13150 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13160 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
13170 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
13180 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
13190 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
131a0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
131b0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
131c0 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
131d0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
131e0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
131f0 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
13200 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
13210 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
13220 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
13230 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
13240 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
13250 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
13260 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
13270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
13280 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
13290 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
132a0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
132b0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
132c0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
132d0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
132e0 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
132f0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
13300 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
13310 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
13320 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13340 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
13350 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
13360 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
13370 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
13380 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
13390 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
133a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
133b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
133c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
133d0 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
133e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
133f0 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
13400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
13410 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
13420 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
13430 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
13440 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
13450 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
13460 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
13470 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
13480 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
13490 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
134a0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
134b0 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
134c0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
134d0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
134e0 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
134f0 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
13500 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
13510 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
13520 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
13530 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
13540 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
13550 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
13560 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
13570 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
13580 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
13590 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
135a0 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
135b0 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
135c0 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
135d0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
135e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
135f0 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
13600 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
13610 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
13620 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
13630 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
13640 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
13650 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
13660 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
13670 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
13680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13690 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
136a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
136b0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
136c0 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
136d0 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
136e0 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
136f0 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
13700 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
13710 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
13720 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
13730 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
13740 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
13750 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
13760 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
13770 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
13780 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
13790 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
137a0 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
137b0 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
137c0 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
137d0 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
137e0 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
137f0 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
13800 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
13810 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
13820 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
13830 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
13840 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
13850 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
13860 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
13870 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
13880 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
13890 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
138a0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
138b0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
138c0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
138d0 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
138e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
138f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13900 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
13910 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
13920 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
13930 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13940 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
13950 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
13960 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
13970 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
13980 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13990 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
139a0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
139b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
139c0 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
139d0 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
139e0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
139f0 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
13a00 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
13a10 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
13a20 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
13a30 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
13a40 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
13a50 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
13a60 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
13a70 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
13a80 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
13a90 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
13aa0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13ab0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
13ac0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
13ad0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13ae0 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
13af0 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
13b00 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
13b10 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
13b20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
13b30 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
13b40 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
13b50 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
13b60 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
13b70 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13b80 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13b90 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
13ba0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
13bb0 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
13bc0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
13bd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13be0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13bf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13c10 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
13c20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
13c30 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
13c40 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
13c50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13c70 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
13c80 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
13c90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61       nFullPathna
13cc0 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
13cd0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
13ce0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
13cf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
13d00 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
13d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13d20 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
13d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
13d50 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
13d60 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78  SAFE.      mutex
13d70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
13d80 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
13d90 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
13da0 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
13db0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13dc0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
13dd0 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
13de0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13df0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
13e00 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
13e10 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13e20 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
13e30 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
13e40 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
13e50 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
13e60 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
13e70 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
13e80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13e90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
13ea0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
13eb0 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
13ec0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
13ed0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
13ee0 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  me(pBt->pPager, 
13ef0 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
13f00 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
13f10 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
13f20 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
13f30 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
13f40 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
13f50 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
13f60 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
13f70 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
13f80 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
13f90 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
13fa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
13fb0 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
13fc0 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
13fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13fe0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
13ff0 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
14000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14010 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14020 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
14030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14040 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
14050 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
14060 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14070 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
14080 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14090 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
140a0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
140b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
140c0 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
140d0 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
140e0 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
140f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14120 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
14130 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
14140 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14150 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
14160 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
14170 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
14180 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
14190 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
141a0 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
141b0 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
141c0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
141d0 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
141e0 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
141f0 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
14200 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
14210 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
14220 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
14230 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
14240 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
14250 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
14260 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
14270 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
14280 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
14290 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
142a0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
142b0 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
142c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
142d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
142e0 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
142f0 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
14300 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
14310 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
14320 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
14330 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
14340 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
14350 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
14360 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
14370 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
14380 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
14390 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
143a0 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
143b0 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
143c0 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
143d0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
143e0 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
143f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14400 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
14410 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14420 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
14430 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
14440 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
14450 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
14460 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
14470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
14480 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
14490 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
144a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
144b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
144c0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
144d0 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
144e0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
14500 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
14510 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
14520 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
14530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14540 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14550 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
14560 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
14570 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
14580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14590 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
145a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
145b0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
145c0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
145d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
145e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
145f0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14600 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
14610 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
14620 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
14630 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
14640 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14650 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
14660 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
14670 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
14680 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
14690 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
146a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
146b0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
146c0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
146d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
146e0 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
146f0 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
14700 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
14710 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
14720 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
14730 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
14740 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
14750 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
14760 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
14770 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
14780 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
14790 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
147a0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
147b0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
147c0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
147d0 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
147e0 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
147f0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
14800 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
14810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14820 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
14830 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
14840 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
14850 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
14860 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
14870 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
14880 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
14890 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
148a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
148b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
148c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
148d0 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
148e0 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
148f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14900 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14910 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
14920 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
14930 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
14940 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14950 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
14960 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
14970 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
14980 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
14990 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
149a0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
149b0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
149c0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
149d0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
149e0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
149f0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
14a00 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
14a10 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
14a20 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
14a30 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
14a40 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
14a50 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
14a60 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
14a70 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
14a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14a90 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
14aa0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
14ab0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14ac0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14ad0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
14ae0 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
14af0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
14b00 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14b10 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
14b20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14b30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
14b40 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
14b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14b60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14b70 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
14b80 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
14b90 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
14ba0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
14bb0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
14bc0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
14bd0 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
14be0 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
14bf0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
14c00 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
14c10 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
14c20 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
14c30 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
14c40 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14c50 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
14c60 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
14c70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14c80 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
14c90 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
14ca0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
14cb0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
14cc0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
14cd0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
14ce0 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
14cf0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
14d00 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
14d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14d20 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
14d30 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
14d40 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
14d50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
14d60 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
14d70 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
14d80 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
14d90 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
14da0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
14db0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
14dc0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
14dd0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
14de0 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
14df0 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
14e00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
14e10 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
14e20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14e30 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
14e40 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
14e50 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
14e60 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
14e70 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
14e80 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
14e90 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
14ea0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
14eb0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
14ec0 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
14ed0 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
14ee0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
14ef0 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
14f00 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
14f10 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14f20 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14f30 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
14f40 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14f50 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
14f60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
14f70 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
14f80 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
14f90 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14fa0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
14fb0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
14fc0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
14fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14fe0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
14ff0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
15000 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
15010 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
15020 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
15030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15050 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
15060 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
15070 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
15080 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15090 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
150a0 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
150b0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
150c0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
150d0 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
150e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
150f0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
15100 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
15110 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
15120 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
15130 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
15140 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15150 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
15160 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
15170 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
15180 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
15190 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
151a0 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
151b0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
151c0 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
151d0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
151e0 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
151f0 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
15200 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
15210 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
15220 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15230 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
15240 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
15250 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
15260 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
15270 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15280 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
15290 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
152a0 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
152b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
152c0 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
152d0 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
152e0 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
152f0 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
15300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
15310 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
15320 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
15330 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
15340 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
15350 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15360 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
15370 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
15380 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
15390 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
153a0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
153b0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
153c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
153d0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
153e0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
153f0 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
15400 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
15410 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
15420 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
15430 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
15440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15450 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
15460 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
15470 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15490 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
154a0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
154b0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
154c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
154d0 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
154e0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
154f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
15500 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
15510 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
15520 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
15530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
15540 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
15550 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
15560 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
15570 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
15580 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
15590 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
155a0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
155b0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
155c0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
155d0 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
155e0 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
155f0 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
15600 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
15610 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
15620 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
15630 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
15640 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
15650 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
15660 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
15670 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
15680 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
15690 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
156a0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
156b0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
156c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
156d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
156e0 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
156f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15700 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
15710 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15720 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
15730 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
15740 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
15750 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
15760 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
15770 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
15780 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15790 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
157a0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
157b0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
157c0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
157d0 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
157e0 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
157f0 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
15800 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
15810 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
15820 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
15830 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
15840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15850 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
15860 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15870 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
15880 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
15890 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
158a0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
158b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
158c0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
158d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
158e0 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
158f0 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15900 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15910 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15920 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
15930 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
15940 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
15950 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
15960 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
15970 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
15980 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15990 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
159a0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
159b0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
159c0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
159d0 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
159e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
159f0 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
15a00 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15a10 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15a20 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
15a30 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
15a40 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
15a50 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
15a60 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
15a70 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
15a80 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
15a90 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
15aa0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
15ab0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
15ad0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15ae0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15af0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
15b00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
15b10 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
15b20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
15b30 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
15b40 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
15b50 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
15b60 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
15b70 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15b80 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
15b90 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
15ba0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
15bb0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
15bc0 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
15bd0 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
15be0 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
15bf0 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
15c00 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
15c10 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
15c20 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15c30 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
15c40 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
15c50 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
15c60 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
15c70 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
15c80 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
15c90 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
15ca0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
15cb0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
15cc0 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
15cd0 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
15ce0 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
15cf0 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
15d00 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
15d10 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
15d20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
15d30 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
15d40 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
15d50 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
15d60 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
15d70 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
15d80 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
15d90 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
15da0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
15db0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
15dc0 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
15dd0 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
15de0 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
15df0 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
15e00 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
15e10 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
15e20 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
15e30 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
15e40 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
15e50 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
15e60 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
15e70 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
15e80 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
15e90 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
15ea0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
15eb0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
15ec0 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
15ed0 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
15ee0 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
15ef0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
15f00 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
15f10 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
15f20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
15f30 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
15f40 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
15f50 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
15f60 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
15f70 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
15f80 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
15f90 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
15fa0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
15fb0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
15fc0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
15fd0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
15fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15ff0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16000 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16010 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
16020 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
16030 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
16040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16050 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
16060 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
16070 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
16080 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
16090 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
160a0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
160b0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
160c0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
160d0 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
160e0 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
160f0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
16100 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
16110 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16120 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
16130 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
16140 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
16150 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
16160 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
16170 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
16180 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16190 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
161a0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
161b0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
161c0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
161d0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
161e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
161f0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
16200 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
16210 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16220 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
16230 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
16240 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
16250 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
16260 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
16270 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
16280 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
16290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
162a0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
162b0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
162c0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
162d0 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
162e0 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
162f0 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
16300 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
16310 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
16320 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
16330 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
16340 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
16350 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
16360 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
16370 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
16380 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
16390 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
163a0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
163b0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
163c0 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
163d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
163e0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
163f0 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
16400 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
16410 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
16420 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
16430 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
16440 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
16450 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
16460 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
16470 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
16480 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
16490 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
164a0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
164b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
164c0 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
164d0 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
164e0 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
164f0 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
16500 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16510 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
16520 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16530 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
16540 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
16550 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
16560 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
16570 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
16580 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
16590 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
165a0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
165b0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
165c0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
165d0 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
165e0 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
165f0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
16600 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
16610 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
16620 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
16630 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
16640 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
16650 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16660 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16670 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
16680 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
16690 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
166a0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
166b0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
166c0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
166d0 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
166e0 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
166f0 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
16700 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
16710 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16730 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
16740 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
16750 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16760 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
16770 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
16780 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
16790 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
167a0 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
167b0 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
167c0 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
167d0 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
167e0 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
167f0 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
16800 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
16810 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
16820 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
16830 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
16840 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
16850 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
16860 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
16870 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
16880 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
16890 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
168a0 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
168b0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
168c0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
168d0 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
168e0 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
168f0 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
16900 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
16910 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
16920 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
16930 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
16940 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
16950 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
16960 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
16970 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
16980 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
16990 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
169a0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
169b0 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
169c0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
169d0 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
169e0 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
169f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16a00 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
16a10 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
16a20 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
16a30 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16a40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16a50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16a60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16a70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16a80 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16a90 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16aa0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
16ab0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
16ac0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ae0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
16af0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
16b00 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16b10 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
16b20 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
16b30 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
16b40 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
16b50 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
16b60 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
16b70 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
16b80 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
16b90 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
16ba0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16bb0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
16bc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16bd0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16be0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16bf0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
16c00 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
16c10 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
16c20 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
16c30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16c40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16c50 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
16c60 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
16c70 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
16c80 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
16c90 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
16ca0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
16cb0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
16cc0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
16cd0 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
16ce0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
16cf0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
16d00 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
16d10 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
16d20 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
16d30 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
16d40 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
16d50 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
16d60 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
16d70 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
16d80 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
16d90 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
16da0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
16db0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
16dc0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
16dd0 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
16de0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
16df0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
16e00 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
16e10 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
16e20 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
16e30 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
16e40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
16e50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
16e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
16e70 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
16e80 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
16e90 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
16ea0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
16eb0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
16ec0 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
16ed0 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
16ee0 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
16ef0 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
16f00 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16f10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16f20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16f30 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16f40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16f50 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
16f60 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
16f70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
16f80 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
16f90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16fb0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16fc0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
16fd0 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
16fe0 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
16ff0 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
17000 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
17010 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
17020 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
17030 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
17040 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17050 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
17060 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
17070 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17080 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
17090 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
170a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
170b0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
170c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
170d0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
170e0 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
170f0 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
17100 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
17110 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
17120 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17130 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17140 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
17150 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
17160 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
17170 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17180 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
17190 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
171a0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
171b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
171c0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
171d0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
171e0 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
171f0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
17200 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
17210 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
17220 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
17230 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
17240 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
17250 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
17260 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
17270 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
17280 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
17290 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
172a0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
172b0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
172c0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
172d0 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
172e0 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
172f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17300 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
17310 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
17320 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
17330 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
17340 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
17350 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
17360 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
17370 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
17380 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
17390 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
173a0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
173b0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
173c0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
173d0 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
173e0 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
173f0 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
17400 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
17410 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
17420 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
17430 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
17440 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
17450 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
17460 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
17470 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
17480 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
17490 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
174a0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
174b0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
174c0 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
174d0 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
174e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
174f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17500 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
17510 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
17520 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
17530 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17540 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
17550 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
17560 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
17570 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
17580 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
17590 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
175a0 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
175b0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
175c0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
175d0 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
175e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
175f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17600 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17610 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
17620 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
17630 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
17640 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
17650 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
17660 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
17670 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
17680 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
17690 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
176a0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
176b0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
176c0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
176d0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
176e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
176f0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
17700 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17710 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
17720 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
17730 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
17740 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
17750 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
17760 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17770 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
17780 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
17790 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
177a0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
177b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
177c0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
177d0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
177e0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
177f0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17800 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
17810 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17820 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17840 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
17850 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
17860 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
17870 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
17880 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
17890 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
178a0 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
178b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
178c0 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
178d0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
178e0 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
178f0 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
17900 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
17910 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
17920 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
17930 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
17940 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
17950 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
17960 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
17970 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
17980 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
17990 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
179a0 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
179b0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
179c0 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
179d0 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
179e0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
179f0 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
17a00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
17a10 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
17a20 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
17a30 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
17a40 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
17a50 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
17a60 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
17a70 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17a80 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
17a90 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
17aa0 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
17ab0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
17ac0 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
17ad0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
17ae0 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
17af0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17b00 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
17b10 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
17b20 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
17b30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
17b40 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
17b50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17b60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17b70 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
17b80 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
17b90 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
17ba0 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
17bb0 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
17bc0 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
17bd0 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
17be0 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
17bf0 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
17c00 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
17c10 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
17c20 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
17c30 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
17c40 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
17c50 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
17c60 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
17c70 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
17c80 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
17c90 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
17ca0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
17cb0 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
17cc0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
17cd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17ce0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17cf0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17d00 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
17d10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
17d20 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
17d30 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
17d40 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
17d50 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17d60 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
17d70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17d80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
17d90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
17da0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
17db0 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
17dc0 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
17dd0 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
17de0 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
17df0 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
17e00 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
17e10 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
17e20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
17e30 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
17e40 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17e50 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
17e60 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
17e70 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
17e80 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
17e90 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
17ea0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
17eb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
17ec0 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
17ed0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
17ee0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
17ef0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17f00 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
17f10 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43   Set the BTS_SEC
17f20 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20  URE_DELETE flag 
17f30 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20  if newFlag is 0 
17f40 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61  or 1.  If newFla
17f50 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e  g is -1,.** then
17f60 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   make no changes
17f70 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
17f80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17f90 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
17fa0 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61  ETE.** setting a
17fb0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e  fter the change.
17fc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17fd0 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
17fe0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
17ff0 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
18000 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
18010 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
18020 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18030 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
18040 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
18050 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
18060 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
18070 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67  .    if( newFlag
18080 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c   ) p->pBt->btsFl
18090 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
180a0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20  E_DELETE;.  } . 
180b0 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
180c0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
180d0 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a  URE_DELETE)!=0;.
180e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
180f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18100 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
18110 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
18120 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
18130 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
18140 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
18150 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
18160 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
18170 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
18180 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
18190 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
181a0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
181b0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
181c0 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
181d0 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
181e0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
181f0 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
18200 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
18210 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
18220 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
18230 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
18240 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
18250 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
18260 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
18280 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
18290 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
182a0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
182b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
182c0 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
182d0 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
182e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
182f0 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
18300 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
18310 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
18320 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
18330 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
18340 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18350 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
18360 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
18370 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
18380 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
18390 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
183a0 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
183b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
183c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
183d0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
183e0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
183f0 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
18400 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
18410 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
18420 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
18430 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
18440 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
18450 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
18460 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
18470 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
18480 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
18490 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
184a0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
184b0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
184c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
184d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
184e0 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
184f0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
18500 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
18510 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
18520 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
18530 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
18540 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
18550 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
18560 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
18570 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18580 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
18590 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
185a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
185b0 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
185c0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
185d0 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
185e0 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
185f0 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
18600 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
18610 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
18620 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
18630 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
18640 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
18650 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
18660 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
18670 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
18680 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
18690 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
186a0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
186b0 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
186c0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
186d0 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
186e0 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
186f0 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
18700 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
18710 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18720 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
18730 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
18740 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
18750 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
18760 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
18770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18780 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
18790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
187a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
187b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
187c0 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65  .  int nPageFile
187d0 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
187e0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
187f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18800 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65  */.  int nPageHe
18810 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
18820 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18830 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
18840 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
18850 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
18860 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18870 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18880 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
18890 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
188a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
188b0 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
188c0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
188d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
188e0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
188f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18900 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
18910 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18920 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18930 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
18940 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
18950 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
18960 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
18970 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
18980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18990 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
189a0 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65  nPageHeader = ge
189b0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
189c0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
189d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
189e0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
189f0 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b  er, &nPageFile);
18a00 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
18a10 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38  || memcmp(24+(u8
18a20 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
18a30 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d   92+(u8*)pPage1-
18a40 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a  >aData,4)!=0 ){.
18a50 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
18a60 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eFile;.  }.  if(
18a70 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
18a80 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
18a90 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
18aa0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
18ab0 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
18ac0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18ad0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
18ae0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
18af0 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
18b00 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
18b10 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
18b20 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
18b30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
18b40 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
18b50 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
18b60 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
18b70 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
18b80 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
18b90 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
18ba0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
18bb0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
18bc0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
18bd0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
18be0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
18bf0 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
18c00 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
18c10 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
18c20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
18c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18c40 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
18c50 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18c60 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18c70 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
18c80 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
18c90 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
18ca0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
18cb0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
18cc0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
18cd0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18ce0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18cf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
18d00 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
18d10 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
18d20 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
18d30 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
18d40 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
18d50 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
18d60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18d70 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
18d80 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
18d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18da0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
18db0 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
18dc0 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
18dd0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
18de0 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
18df0 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
18e00 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
18e10 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
18e20 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
18e30 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
18e40 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
18e50 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
18e60 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
18e70 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
18e80 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
18e90 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
18ea0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
18eb0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
18ec0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
18ed0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
18ee0 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
18ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
18f00 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
18f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18f20 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
18f30 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
18f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f60 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18f70 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18f80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
18f90 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
18fa0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18fb0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
18fc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
18ff0 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
19000 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
19010 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
19020 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
19030 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
19040 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
19050 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
19060 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
19070 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
19080 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
19090 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
190a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
190b0 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
190c0 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
190d0 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
190e0 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
190f0 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
19100 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
19110 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
19120 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
19130 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
19140 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
19150 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19160 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19170 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
19180 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
19190 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
191a0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
191b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
191c0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
191d0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
191e0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
191f0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
19200 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
19210 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
19220 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19230 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
19240 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
19250 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
19260 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
19270 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19280 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
19290 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
192a0 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
192b0 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
192c0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
192d0 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
192e0 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
192f0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
19300 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
19310 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
19320 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
19330 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
19340 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
19350 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
19360 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
19370 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
19380 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
19390 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
193a0 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
193b0 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
193c0 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
193d0 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
193e0 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
193f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19400 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
19410 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
19420 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
19430 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
19440 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
19450 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
19460 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
19470 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
19480 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
19490 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
194a0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
194b0 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
194c0 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
194d0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
194e0 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
194f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19500 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
19510 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
19520 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
19530 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
19540 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
19550 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
19560 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
19570 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
19580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19590 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
195a0 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
195b0 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
195c0 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
195d0 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
195e0 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
195f0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
19600 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
19610 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
19620 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
19630 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
19640 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
19650 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
19660 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
19670 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
19680 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
19690 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
196a0 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
196b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
196c0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
196d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
196e0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
196f0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
19700 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
19710 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
19720 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
19730 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19740 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
19750 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
19760 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
19790 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
197a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
197b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
197c0 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
197d0 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
197e0 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
197f0 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
19800 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19810 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19820 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19830 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19840 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19850 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
19860 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
19870 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
19880 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
19890 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
198a0 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
198b0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
198c0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
198d0 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
198e0 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
198f0 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
19900 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
19910 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
19920 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
19930 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19940 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
19950 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
19960 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
19970 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
19980 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
19990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
199a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
199b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
199c0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
199d0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
199e0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
199f0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
19a00 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
19a10 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
19a20 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
19a30 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
19a40 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
19a50 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
19a60 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
19a70 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
19a80 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
19a90 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
19aa0 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
19ab0 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
19ac0 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
19ad0 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
19ae0 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
19af0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
19b00 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
19b10 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
19b20 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
19b30 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
19b40 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
19b50 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
19b60 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
19b70 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
19b80 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
19b90 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
19ba0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
19bb0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
19bc0 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
19bd0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
19be0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
19bf0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
19c00 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
19c10 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
19c20 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
19c30 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
19c40 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
19c50 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
19c60 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
19c70 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
19c80 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
19c90 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19ca0 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
19cb0 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
19cc0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
19cd0 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
19ce0 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
19cf0 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
19d00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19d10 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
19d20 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
19d30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
19d40 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
19d50 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
19d60 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
19d70 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
19d80 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
19d90 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
19da0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
19db0 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
19dc0 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
19dd0 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
19de0 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
19df0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
19e00 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
19e10 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
19e20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
19e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
19e40 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
19e50 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19e60 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
19e70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
19e80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
19e90 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
19ea0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
19eb0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
19ec0 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
19ed0 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
19ee0 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
19ef0 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
19f00 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
19f10 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
19f20 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
19f30 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
19f40 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
19f50 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
19f60 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
19f70 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
19f80 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
19f90 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
19fa0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
19fb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
19fc0 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
19fd0 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
19fe0 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
19ff0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1a000 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1a010 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
1a020 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
1a030 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
1a040 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
1a050 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
1a060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1a070 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1a080 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
1a090 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
1a0a0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
1a0b0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
1a0c0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
1a0d0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
1a0e0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
1a0f0 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
1a100 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
1a110 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
1a120 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
1a130 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1a140 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
1a150 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
1a160 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
1a170 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
1a180 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1a190 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
1a1a0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
1a1b0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
1a1c0 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
1a1d0 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
1a1e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a1f0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
1a200 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
1a210 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1a220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a230 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
1a240 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
1a250 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
1a260 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
1a270 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
1a280 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1a290 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
1a2a0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1a2b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
1a2c0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1a2d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1a2e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a2f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1a300 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1a310 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1a320 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
1a330 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
1a340 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
1a350 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
1a360 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a370 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
1a380 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
1a390 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1a3a0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1a3b0 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
1a3c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1a3d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1a3e0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1a3f0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
1a400 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
1a410 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
1a420 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
1a430 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
1a440 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
1a450 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
1a460 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
1a470 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
1a480 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
1a490 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
1a4a0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
1a4b0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1a4c0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1a4d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a4e0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
1a4f0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
1a500 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
1a510 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
1a520 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
1a530 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a540 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1a550 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
1a560 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
1a570 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a580 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
1a590 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1a5a0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
1a5b0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
1a5c0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
1a5d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a5e0 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
1a5f0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1a600 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
1a610 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
1a620 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
1a630 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
1a640 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
1a650 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
1a660 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
1a670 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1a680 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
1a690 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
1a6a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
1a6b0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
1a6c0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
1a6d0 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
1a6e0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
1a6f0 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
1a700 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
1a710 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
1a720 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
1a730 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
1a740 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
1a750 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
1a760 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
1a770 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
1a780 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
1a790 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
1a7a0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
1a7b0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
1a7c0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
1a7d0 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
1a7e0 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
1a7f0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
1a800 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
1a810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a820 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
1a830 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1a840 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
1a850 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
1a860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1a870 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
1a880 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
1a890 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
1a8a0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
1a8b0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
1a8c0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
1a8d0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
1a8e0 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
1a8f0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
1a900 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
1a910 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
1a920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1a940 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
1a950 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1a960 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
1a970 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
1a980 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
1a990 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
1a9a0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
1a9b0 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
1a9c0 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
1a9d0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1a9e0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1a9f0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
1aa00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1aa10 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
1aa20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1aa30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1aa40 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
1aa50 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
1aa60 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
1aa70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1aa80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1aa90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1aaa0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
1aab0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1aac0 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
1aad0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
1aae0 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
1aaf0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1ab00 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
1ab10 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
1ab20 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
1ab30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1ab40 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
1ab50 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
1ab60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ab70 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
1ab80 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
1ab90 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
1aba0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
1abb0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
1abc0 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
1abd0 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
1abe0 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
1abf0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
1ac00 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1ac10 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
1ac20 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
1ac30 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
1ac40 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
1ac50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1ac60 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1ac70 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1ac80 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1ac90 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
1aca0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
1acb0 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
1acc0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1acd0 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
1ace0 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
1acf0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1ad00 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
1ad10 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
1ad20 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1ad30 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ad40 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1ad50 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1ad60 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1ad70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1ad80 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1ad90 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1ada0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1adb0 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1adc0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1add0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ade0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1adf0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1ae00 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1ae10 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1ae20 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1ae30 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1ae40 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1ae50 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1ae60 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1ae70 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1ae80 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1ae90 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1aea0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1aeb0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1aec0 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1aed0 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1aee0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1aef0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1af00 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1af10 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1af20 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1af30 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1af40 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1af50 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1af60 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1af70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1af80 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1af90 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1afa0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1afb0 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1afc0 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1afd0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1afe0 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1aff0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1b000 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1b010 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1b020 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1b030 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1b040 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1b050 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1b060 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1b070 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1b080 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1b090 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1b0a0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1b0b0 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1b0c0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1b0d0 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1b0e0 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1b0f0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1b100 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1b110 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1b120 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1b130 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b140 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1b150 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1b160 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
1b170 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
1b180 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b190 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1b1a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1b1b0 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 28   bConcurrent = (
1b1c0 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65  p->db->bConcurre
1b1d0 6e 74 20 26 26 20 21 49 53 41 55 54 4f 56 41 43  nt && !ISAUTOVAC
1b1e0 55 55 4d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  UUM);..  sqlite3
1b1f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1b200 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1b210 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1b220 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
1b230 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
1b240 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
1b250 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
1b260 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
1b270 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
1b280 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
1b290 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
1b2a0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
1b2b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1b2c0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1b2d0 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
1b2e0 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
1b2f0 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
1b300 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1b310 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  un;.  }.  assert
1b320 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1b330 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1b340 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56  E || IfNotOmitAV
1b350 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
1b360 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  e)==0 );..  /* W
1b370 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b380 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
1b390 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
1b3a0 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
1b3b0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1b3c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1b3d0 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67  LY)!=0 && wrflag
1b3e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1b3f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1b400 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1b410 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
1b420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b430 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
1b440 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
1b450 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
1b460 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
1b470 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b480 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
1b490 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
1b4a0 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
1b4b0 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
1b4c0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
1b4d0 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1b4e0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1b4f0 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
1b500 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1b510 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b520 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d  ITE).   || (pBt-
1b530 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1b540 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b  PENDING)!=0.  ){
1b550 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
1b560 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
1b570 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
1b580 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
1b590 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
1b5a0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1b5b0 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1b5c0 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1b5d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
1b5e0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1b5f0 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
1b600 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
1b610 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
1b620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b630 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
1b640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
1b650 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1b660 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1b670 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1b680 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1b690 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
1b6a0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
1b6b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
1b6c0 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
1b6d0 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
1b6e0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
1b6f0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
1b700 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
1b710 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
1b720 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
1b730 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
1b740 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
1b750 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
1b760 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
1b770 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
1b780 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
1b790 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1b7a0 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
1b7b0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
1b7c0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
1b7d0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1b7e0 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
1b7f0 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
1b800 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
1b810 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
1b820 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1b830 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
1b840 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
1b850 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
1b860 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
1b870 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
1b880 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
1b890 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
1b8a0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1b8b0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1b8c0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
1b8d0 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
1b8e0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1b8f0 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
1b900 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
1b910 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
1b920 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
1b930 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
1b940 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
1b950 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b960 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
1b970 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
1b980 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
1b990 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
1b9a0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
1b9b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
1b9c0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1b9d0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1b9e0 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
1b9f0 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
1ba00 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
1ba10 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
1ba20 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
1ba30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba40 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1ba50 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
1ba60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1ba70 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
1ba80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ba90 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1baa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bab0 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d 20     int exFlag = 
1bac0 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31  bConcurrent ? -1
1bad0 20 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20   : (wrflag>1);. 
1bae0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1baf0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1bb00 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c 61  t->pPager, exFla
1bb10 67 2c 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  g, sqlite3TempIn
1bb20 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1bb30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1bb40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bb50 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1bb60 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1bb70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bb80 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1bb90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bba0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1bbb0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1bbc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1bbd0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1bbe0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1bbf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1bc00 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1bc10 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1bc20 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1bc30 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
1bc40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bc50 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1bc60 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
1bc70 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1bc80 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
1bc90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bca0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1bcb0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
1bcc0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
1bcd0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
1bce0 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
1bcf0 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
1bd00 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1bd10 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
1bd20 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
1bd30 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
1bd40 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
1bd50 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
1bd60 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
1bd70 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
1bd80 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
1bd90 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
1bda0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
1bdb0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1bdc0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bdd0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
1bde0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1bdf0 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
1be00 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1be10 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
1be20 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1be30 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
1be40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1be50 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1be60 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
1be70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
1be80 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
1be90 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
1bea0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
1beb0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
1bec0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
1bed0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1bee0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
1bef0 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
1bf00 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
1bf10 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
1bf20 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
1bf30 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
1bf40 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
1bf50 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
1bf60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bf70 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
1bf80 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
1bf90 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
1bfa0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
1bfb0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1bfc0 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
1bfd0 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
1bfe0 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
1bff0 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
1c000 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
1c010 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
1c020 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
1c030 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
1c040 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1c050 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1c060 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1c070 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
1c080 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
1c090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1c0a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c0b0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1c0c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c0d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c0e0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1c0f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1c100 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1c110 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1c120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c130 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 23  ..trans_begun:.#
1c140 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c150 42 4c 45 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  BLE_CONCURRENT. 
1c160 20 69 66 28 20 62 43 6f 6e 63 75 72 72 65 6e 74   if( bConcurrent
1c170 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1c180 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65  K && sqlite3Page
1c190 72 49 73 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  rIsWal(pBt->pPag
1c1a0 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
1c1b0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1c1c0 6e 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d  nConcurrent(pBt-
1c1d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1c1e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c1f0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1c200 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
1c210 6d 61 70 41 6c 6c 6f 63 61 74 65 28 70 42 74 29  mapAllocate(pBt)
1c220 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1c230 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  if..  if( rc==SQ
1c240 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1c250 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
1c260 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1c270 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1c280 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1c290 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
1c2a0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1c2b0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1c2c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1c2d0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1c2e0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1c2f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1c300 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1c310 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1c320 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
1c330 20 20 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69      int nSavepoi
1c340 6e 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  nt = p->db->nSav
1c350 65 70 6f 69 6e 74 3b 0a 20 20 20 20 72 63 20 3d  epoint;.    rc =
1c360 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1c370 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1c380 70 50 61 67 65 72 2c 20 6e 53 61 76 65 70 6f 69  pPager, nSavepoi
1c390 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1c3a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53  =SQLITE_OK && nS
1c3b0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
1c3c0 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d    rc = btreePtrm
1c3d0 61 70 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61  apBegin(pBt, nSa
1c3e0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
1c3f0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1c400 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
1c410 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c420 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c430 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c440 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1c450 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1c460 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1c470 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
1c480 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
1c490 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
1c4a0 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
1c4b0 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
1c4c0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1c4d0 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
1c4e0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
1c4f0 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
1c500 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
1c510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c520 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1c530 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1c540 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1c570 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
1c580 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1c5b0 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
1c5c0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c5f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1c600 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c610 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
1c620 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
1c630 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
1c640 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
1c650 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
1c660 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c670 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1c680 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1c690 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1c6a0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1c6b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c6c0 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
1c6d0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
1c6e0 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
1c6f0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
1c700 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1c710 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1c720 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1c730 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
1c740 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
1c750 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
1c760 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
1c770 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1c780 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1c790 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
1c7a0 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
1c7b0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1c7c0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1c7d0 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1c7e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c7f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c800 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1c810 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1c820 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1c830 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1c840 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
1c850 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1c860 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1c870 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73  no, &rc);.  }..s
1c880 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
1c890 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
1c8a0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
1c8b0 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
1c8c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
1c8d0 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
1c8e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
1c8f0 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
1c900 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
1c910 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
1c920 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
1c930 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
1c940 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
1c950 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
1c960 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
1c970 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
1c980 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
1c990 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1c9a0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1c9b0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
1c9c0 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1c9e0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
1c9f0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ca00 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
1ca10 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1ca20 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1ca30 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
1ca60 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
1ca70 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
1ca80 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1ca90 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
1caa0 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
1cab0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1cac0 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
1cad0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1cae0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
1caf0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
1cb00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1cb10 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1cb20 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1cb30 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
1cb40 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
1cb50 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1cb60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1cb70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1cb80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1cb90 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1cba0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1cbb0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1cbc0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1cbd0 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
1cbe0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
1cbf0 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
1cc00 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
1cc10 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1cc20 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
1cc30 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1cc40 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
1cc50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cc60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1cc70 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
1cc80 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1cc90 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1cca0 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
1ccb0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
1ccc0 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
1ccd0 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1cce0 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1ccf0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1cd00 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1cd10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1cd20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1cd30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1cd40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1cd50 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1cd60 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1cd70 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1cd80 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1cd90 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1cda0 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1cdb0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1cdc0 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1cdd0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1cde0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1cdf0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
1ce00 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
1ce10 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69   && pCell+info.i
1ce20 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67  Overflow+3<=pPag
1ce30 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1ce40 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
1ce50 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
1ce60 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1ce70 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20  .iOverflow]).   
1ce80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1ce90 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
1cea0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
1ceb0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
1cec0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ced0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1cee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
1cef0 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
1cf00 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
1cf10 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
1cf20 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1cf30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1cf50 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
1cf60 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
1cf70 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
1cf80 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
1cf90 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
1cfa0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1cfb0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
1cfc0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1cfd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1cfe0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1cff0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1d000 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d010 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d020 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1d030 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
1d040 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
1d050 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
1d060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1d070 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1d080 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1d090 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1d0a0 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1d0b0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1d0c0 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1d0d0 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1d0e0 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1d0f0 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1d100 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1d110 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1d120 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1d130 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1d140 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1d150 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1d160 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1d170 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1d180 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1d190 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1d1a0 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1d1b0 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1d1c0 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1d1d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1d1e0 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1d1f0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1d200 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1d210 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1d220 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1d230 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1d240 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1d270 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1d280 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1d290 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1d2a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d2b0 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1d2c0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1d2d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1d2e0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1d2f0 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1d300 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1d310 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1d320 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1d330 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1d340 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1d350 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1d360 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1d370 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1d380 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1d390 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1d3a0 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1d3b0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1d3c0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1d3d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d3e0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1d3f0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1d400 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1d410 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1d420 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1d430 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1d440 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1d450 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1d460 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1d470 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d480 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1d490 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1d4a0 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1d4b0 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1d4c0 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1d4d0 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1d4e0 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1d4f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1d500 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1d510 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1d520 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1d530 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1d540 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1d550 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1d560 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1d570 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1d580 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d590 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1d5a0 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1d5b0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1d5c0 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1d5d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d5e0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d5f0 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1d600 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1d610 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1d620 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1d630 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1d640 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1d650 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1d660 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1d670 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1d680 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1d690 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1d6a0 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1d6b0 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1d6c0 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1d6d0 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1d6e0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1d6f0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1d700 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1d710 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1d720 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1d730 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1d740 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1d750 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1d760 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1d770 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1d780 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1d790 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1d7a0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1d7b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d7c0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1d7d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1d7e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1d7f0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1d800 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1d810 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d820 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d830 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1d840 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1d850 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1d860 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1d870 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1d880 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1d890 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1d8a0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1d8b0 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1d8c0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1d8d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d8e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d8f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d900 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1d910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1d920 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1d930 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1d940 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1d950 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1d960 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1d970 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1d980 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1d990 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1d9a0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1d9b0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1d9c0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1d9d0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1d9e0 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1d9f0 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1da00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1da10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1da20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1da30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1da40 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1da50 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1da60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1da70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1da80 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1da90 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1daa0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1dab0 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1dac0 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1dad0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1dae0 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1daf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1db00 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1db10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1db20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1db30 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1db40 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1db50 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1db60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1db70 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1db80 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1db90 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1dba0 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1dbb0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1dbc0 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1dbd0 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1dbe0 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1dbf0 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1dc00 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1dc10 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1dc20 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1dc30 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1dc40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1dc50 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1dc60 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1dc70 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1dc80 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1dc90 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1dca0 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1dcb0 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1dcc0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1dcd0 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1dce0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1dcf0 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1dd00 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1dd10 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1dd20 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1dd30 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1dd40 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1dd50 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1dd60 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1dd70 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1dd80 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1dd90 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1dda0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1ddb0 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1ddc0 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1ddd0 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1dde0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1ddf0 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1de00 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1de10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1de20 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1de30 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1de40 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1de50 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1de60 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1de70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1de80 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1de90 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1dea0 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1deb0 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1dec0 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1ded0 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1dee0 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1def0 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1df00 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1df10 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1df20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1df30 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1df40 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1df50 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1df60 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1df70 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1df80 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1df90 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1dfa0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1dfb0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1dfc0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1dfd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1dfe0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1dff0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1e000 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1e010 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1e020 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1e030 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1e040 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e050 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1e060 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1e070 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1e080 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1e090 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e0a0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1e0b0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1e0c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e0d0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1e0e0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1e0f0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1e100 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1e110 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1e120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e130 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1e140 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1e150 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1e160 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1e170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e180 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e190 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1e1a0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1e1b0 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1e1c0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1e1d0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1e1e0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1e1f0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1e200 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1e210 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1e220 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1e230 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1e240 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1e250 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1e260 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1e270 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1e280 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1e290 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1e2a0 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1e2b0 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1e2c0 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1e2d0 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1e2e0 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1e2f0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1e300 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1e310 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1e320 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1e330 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1e340 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1e350 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1e360 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1e370 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1e380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e390 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e3a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1e3b0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1e3c0 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1e3d0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1e3e0 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1e3f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1e400 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1e410 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1e420 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1e430 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1e440 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1e450 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e460 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1e470 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1e480 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1e490 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1e4a0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e4b0 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1e4c0 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1e4d0 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1e4e0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1e4f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1e500 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1e510 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1e520 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1e530 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1e540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e550 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e560 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1e570 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1e580 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1e590 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1e5a0 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1e5b0 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1e5c0 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1e5d0 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1e5e0 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1e5f0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1e600 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e610 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1e620 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1e630 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e640 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1e650 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1e660 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1e670 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1e680 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1e690 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1e6a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1e6b0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1e6c0 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1e6d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e6e0 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1e6f0 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1e700 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1e710 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1e720 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1e730 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1e740 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1e750 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1e760 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1e770 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1e780 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e7a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e7b0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1e7c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e7d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e7e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1e7f0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1e800 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1e810 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1e820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1e830 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1e840 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1e850 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1e860 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1e870 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1e880 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1e890 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1e8a0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1e8b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e8c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e8d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e8f0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1e900 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1e910 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1e920 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1e930 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1e940 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1e950 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e960 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1e970 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1e980 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1e990 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1e9a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e9b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e9c0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1e9d0 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1e9e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1e9f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1ea00 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1ea10 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1ea20 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1ea30 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1ea40 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1ea50 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1ea60 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1ea70 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1ea80 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1ea90 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1eaa0 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1eab0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1eac0 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1ead0 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1eae0 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1eaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1eb00 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1eb10 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1eb20 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1eb30 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1eb40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1eb50 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
1eb60 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1eb70 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1eba0 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
1ebb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1ebc0 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
1ebd0 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
1ebe0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
1ebf0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
1ec00 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
1ec10 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
1ec20 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
1ec30 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
1ec40 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
1ec50 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
1ec60 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1ec70 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
1ec80 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1ec90 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
1eca0 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
1ecb0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1ecc0 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1ecd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
1ece0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
1ecf0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1ed00 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
1ed10 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
1ed20 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
1ed30 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
1ed40 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
1ed50 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
1ed60 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1ed70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
1ed80 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
1ed90 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
1eda0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1edb0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
1edc0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
1edd0 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
1ede0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
1edf0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
1ee00 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
1ee10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1ee20 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
1ee30 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
1ee40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ee50 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
1ee60 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1ee70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ee80 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
1ee90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1eea0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
1eeb0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1eec0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
1eed0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1eee0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
1eef0 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
1ef00 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
1ef10 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
1ef20 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
1ef30 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1ef40 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
1ef50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
1ef60 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1ef70 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1ef80 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
1ef90 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1efa0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
1efb0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
1efc0 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
1efd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1efe0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
1eff0 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
1f000 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1f010 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1f020 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1f030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f040 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
1f050 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1f060 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
1f070 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1f080 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1f090 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
1f0a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1f0b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f0c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f0d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1f0e0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1f0f0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
1f100 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f110 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1f120 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1f130 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1f140 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f150 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
1f160 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f170 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f180 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f190 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1f1a0 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
1f1b0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f1c0 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
1f1d0 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
1f1e0 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
1f1f0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
1f200 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1f210 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1f220 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
1f230 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1f240 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
1f250 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f260 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
1f270 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
1f280 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
1f290 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
1f2a0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1f2b0 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
1f2c0 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
1f2d0 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
1f2e0 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
1f2f0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f300 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
1f310 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
1f320 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f330 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f340 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1f350 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
1f360 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
1f370 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1f380 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a  unt(pPager); )..
1f390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f3a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1f3b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
1f3c0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1f3d0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1f3e0 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
1f3f0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
1f400 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
1f410 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
1f420 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1f430 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f440 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
1f450 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
1f460 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
1f470 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f480 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1f490 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
1f4a0 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
1f4b0 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
1f4c0 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
1f4d0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1f4e0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
1f4f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f500 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
1f510 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
1f520 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1f530 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
1f540 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
1f550 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
1f560 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
1f570 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f580 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
1f590 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
1f5a0 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
1f5b0 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
1f5c0 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
1f5d0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
1f5e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1f5f0 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
1f600 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
1f610 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
1f620 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
1f630 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
1f640 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1f650 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f660 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
1f680 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1f690 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f6a0 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
1f6b0 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1f6c0 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1f6d0 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
1f6e0 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
1f6f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f700 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
1f710 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
1f720 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1f730 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1f740 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
1f750 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
1f760 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
1f770 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
1f780 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
1f790 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1f7a0 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
1f7b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1f7c0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1f7d0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1f7e0 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
1f7f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f800 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1f810 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1f820 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
1f830 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1f840 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
1f850 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f860 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f870 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
1f880 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f890 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1f8a0 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
1f8b0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f8c0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
1f8d0 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
1f8e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f8f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f900 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f910 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
1f920 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f930 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
1f940 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1f950 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
1f960 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1f970 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
1f980 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f990 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
1f9a0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1f9b0 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
1f9c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1f9d0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4e 43 55  ITE_ENABLE_CONCU
1f9e0 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RRENT./*.** This
1f9f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1fa00 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d  led as part of m
1fa10 65 72 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52  erging an CONCUR
1fa20 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e  RENT transaction
1fa30 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61   with.** the sna
1fa40 70 73 68 6f 74 20 61 74 20 74 68 65 20 68 65 61  pshot at the hea
1fa50 64 20 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c  d of the wal fil
1fa60 65 2e 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20  e. It relocates 
1fa70 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1fa80 0a 2a 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74  .** range iFirst
1fa90 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
1faa0 76 65 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  ve. It is assume
1fab0 64 20 74 68 61 74 20 74 68 65 20 42 74 72 65 65  d that the Btree
1fac0 50 74 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63  Ptrmap .** struc
1fad0 74 75 72 65 20 61 74 20 42 74 53 68 61 72 65 64  ture at BtShared
1fae0 2e 70 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74  .pMap contains t
1faf0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
1fb00 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65  he pointers to e
1fb10 61 63 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74  ach.** page in t
1fb20 68 65 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20  he range..**.** 
1fb30 49 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20  If pnCurrent is 
1fb40 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70  NULL, then all p
1fb50 61 67 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67  ages in the rang
1fb60 65 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63  e are moved to c
1fb70 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65  urrently.** free
1fb80 20 6c 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e   locations (i.e.
1fb90 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69   free-list entri
1fba0 65 73 29 20 77 69 74 68 69 6e 20 74 68 65 20 64  es) within the d
1fbb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
1fbc0 6f 72 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72  ore page.** iFir
1fbd0 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  st..**.** Or, if
1fbe0 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f   pnCurrent is no
1fbf0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
1fc00 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75  points to a valu
1fc10 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1fc20 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65  .** current size
1fc30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fc40 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
1fc50 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c  In this case, al
1fc60 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72  l pages are.** r
1fc70 65 6c 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20  elocated to the 
1fc80 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
1fc90 61 73 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20  ase file - page 
1fca0 69 46 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61  iFirst is reloca
1fcb0 74 65 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28  ted to.** page (
1fcc0 2a 70 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70  *pnCurrent+1), p
1fcd0 61 67 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20  age iFirst+1 to 
1fce0 70 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74  page (*pnCurrent
1fcf0 2b 32 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a  +2), and so on..
1fd00 2a 2a 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72  ** Value *pnCurr
1fd10 65 6e 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  ent is set to th
1fd20 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
1fd30 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1fd40 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
1fd50 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
1fd60 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1fd70 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1fd80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1fd90 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
1fda0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
1fdb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
1fdc0 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28  eeRelocateRange(
1fdd0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1fde0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fdf0 20 20 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e     /* B-tree han
1fe00 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  dle */.  Pgno iF
1fe10 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
1fe20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1fe30 74 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61  t page to reloca
1fe40 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61  te */.  Pgno iLa
1fe50 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1fe60 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
1fe70 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65  page to relocate
1fe80 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75   */.  Pgno *pnCu
1fe90 72 72 65 6e 74 20 20 20 20 20 20 20 20 20 20 20  rrent           
1fea0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
1feb0 4e 55 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61  NULL, IN/OUT: Da
1fec0 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29  tabase size */.)
1fed0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1fee0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50  ITE_OK;.  BtreeP
1fef0 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
1ff00 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20  t->pMap;.  Pgno 
1ff10 69 50 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d  iPg;..  for(iPg=
1ff20 69 46 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61  iFirst; iPg<=iLa
1ff30 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1ff40 5f 4f 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  _OK; iPg++){.   
1ff50 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20   MemPage *pFree 
1ff60 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  = 0;     /* Page
1ff70 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20   allocated from 
1ff80 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20  free-list */.   
1ff90 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
1ffa0 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77  0;.    Pgno iNew
1ffb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ffc0 2a 20 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65  * New page numbe
1ffd0 72 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20  r for pPg */.   
1ffe0 20 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45   PtrmapEntry *pE
1fff0 6e 74 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  ntry;    /* Poin
20000 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
20010 72 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20  r page iPg */.. 
20020 20 20 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44     if( iPg==PEND
20030 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20040 74 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  t) ) continue;. 
20050 20 20 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61     pEntry = &pMa
20060 70 2d 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d  p->aPtr[iPg - pM
20070 61 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20  ap->iFirst];..  
20080 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54    if( pEntry->eT
20090 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
200a0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67  PAGE ){.      Pg
200b0 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  no dummy;.      
200c0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
200d0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
200e0 65 65 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c  ee, &dummy, iPg,
200f0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
20100 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20110 67 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ge(pFree);.     
20120 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20130 49 54 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d  ITE_OK || dummy=
20140 3d 69 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73  =iPg );.    }els
20150 65 20 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20  e if( pnCurrent 
20160 29 7b 0a 20 20 20 20 20 20 62 74 72 65 65 47 65  ){.      btreeGe
20170 74 50 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20  tPage(pBt, iPg, 
20180 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
20190 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
201a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
201b0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  pPg->pDbPage) );
201c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
201d0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
201e0 65 66 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62  efcount(pPg->pDb
201f0 50 61 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20  Page)==1 );.    
20200 20 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43    iNew = ++(*pnC
20210 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  urrent);.      i
20220 66 28 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47  f( iNew==PENDING
20230 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
20240 29 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43  ) iNew = ++(*pnC
20250 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72  urrent);.      r
20260 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
20270 28 70 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72  (pBt, pPg, pEntr
20280 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79  y->eType, pEntry
20290 2d 3e 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20  ->parent, iNew, 
202a0 31 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  1);.      releas
202b0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67  ePageNotNull(pPg
202c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
202d0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
202e0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
202f0 26 70 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69  &pFree, &iNew, i
20300 46 69 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43  First-1, BTALLOC
20310 5f 4c 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _LE);.      asse
20320 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
20330 4b 20 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74  K || iNew<iFirst
20340 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
20350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20360 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
20370 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pPg = 0;.       
20380 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
20390 65 65 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  ee);.        btr
203a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
203b0 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  Pg, &pPg, 0);.  
203c0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
203d0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 50 67  atePage(pBt, pPg
203e0 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  , pEntry->eType,
203f0 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c   pEntry->parent,
20400 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20  iNew,1);.       
20410 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
20420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62  ;.}../*.** The b
20450 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 70 61 73  -tree handle pas
20460 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
20470 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
20480 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a  t to commit an.*
20490 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  * CONCURRENT tra
204a0 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 74 68 69  nsaction. At thi
204b0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 20 67 75  s point it is gu
204c0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
204d0 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73 73 69 62  is is .** possib
204e0 6c 65 20 2d 20 74 68 65 20 77 61 6c 20 57 52 49  le - the wal WRI
204f0 54 45 52 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  TER lock is held
20500 20 61 6e 64 20 69 74 20 69 73 20 6b 6e 6f 77 6e   and it is known
20510 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
20520 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 73  .** no conflicts
20530 20 77 69 74 68 20 63 6f 6d 6d 69 74 74 65 64 20   with committed 
20540 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2f  transactions..*/
20550 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
20560 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 42 74 72  eFixUnlocked(Btr
20570 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
20580 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20590 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
205a0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
205b0 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d 20 70 50  1;.  u8 *p1 = pP
205c0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 50  age1->aData;.  P
205d0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
205e0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
205f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20600 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61 67 65 20  ;..  /* If page 
20610 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
20620 65 20 69 73 20 6e 6f 74 20 77 72 69 74 61 62 6c  e is not writabl
20630 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61 67 65 73  e, then no pages
20640 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65 64 0a   were allocated.
20650 20 20 2a 2a 20 6f 72 20 66 72 65 65 64 20 62 79    ** or freed by
20660 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
20670 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
20680 6e 6f 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  no special handl
20690 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ing is .  ** req
206a0 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
206b0 2c 20 69 66 20 70 61 67 65 20 31 20 69 73 20 64  , if page 1 is d
206c0 69 72 74 79 2c 20 70 72 6f 63 65 65 64 2e 20 20  irty, proceed.  
206d0 2a 2f 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  */.  BtreePtrmap
206e0 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
206f0 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e  ap;.  Pgno iTrun
20700 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31  k = get4byte(&p1
20710 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f 20 6e 50  [32]);.  Pgno nP
20720 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
20730 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 75 33 32  ount(pBt);.  u32
20740 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
20750 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 61  e(&p1[36]);..  a
20760 73 73 65 72 74 28 20 70 42 74 2d 3e 70 4d 61 70  ssert( pBt->pMap
20770 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
20780 65 33 50 61 67 65 72 55 70 67 72 61 64 65 53 6e  e3PagerUpgradeSn
20790 61 70 73 68 6f 74 28 70 50 61 67 65 72 2c 20 70  apshot(pPager, p
207a0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
207b0 0a 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70  .  assert( p1==p
207c0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
207d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
207e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 6e 6f  E_OK ){.    Pgno
207f0 20 6e 48 50 61 67 65 20 3d 20 67 65 74 34 62 79   nHPage = get4by
20800 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a 20 20 20  te(&p1[28]);.   
20810 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 6e 48 50   Pgno nFin = nHP
20820 61 67 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  age;         /* 
20830 53 69 7a 65 20 6f 66 20 64 62 20 61 66 74 65 72  Size of db after
20840 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 72   transaction mer
20850 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 73  ge */..    if( s
20860 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
20870 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
20880 44 62 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  DbPage) ){.     
20890 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b 20 3d 20   Pgno iHTrunk = 
208a0 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d  get4byte(&p1[32]
208b0 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e 48 46  );.      u32 nHF
208c0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
208d0 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20 20 20 20  p1[36]);..      
208e0 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 65  /* Attach the he
208f0 61 64 20 64 61 74 61 62 61 73 65 20 66 72 65 65  ad database free
20900 20 6c 69 73 74 20 74 6f 20 74 68 65 20 65 6e 64   list to the end
20910 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
20920 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
20930 74 69 6f 6e 73 20 66 72 65 65 2d 6c 69 73 74 20  tions free-list 
20940 28 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a 20 20  (if any).  */.  
20950 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 21 3d      if( iTrunk!=
20960 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  0 ){.        put
20970 34 62 79 74 65 28 26 70 31 5b 33 36 5d 2c 20 6e  4byte(&p1[36], n
20980 48 46 72 65 65 20 2b 20 6e 46 72 65 65 29 3b 0a  HFree + nFree);.
20990 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
209a0 28 26 70 31 5b 33 32 5d 2c 20 69 54 72 75 6e 6b  (&p1[32], iTrunk
209b0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
209c0 28 20 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  ( iTrunk ){.    
209d0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 54        DbPage *pT
209e0 72 75 6e 6b 20 3d 20 73 71 6c 69 74 65 33 50 61  runk = sqlite3Pa
209f0 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
20a00 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  , iTrunk);.     
20a10 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
20a20 74 34 62 79 74 65 28 28 75 38 2a 29 70 54 72 75  t4byte((u8*)pTru
20a30 6e 6b 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  nk->pData);.    
20a40 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
20a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
20a60 20 20 20 70 75 74 34 62 79 74 65 28 28 75 38 2a     put4byte((u8*
20a70 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 2c 20  )pTrunk->pData, 
20a80 69 48 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  iHTrunk);.      
20a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20aa0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20ab0 66 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  f(pTrunk);.     
20ac0 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     };.      }.. 
20ad0 20 20 20 20 20 69 66 28 20 6e 48 50 61 67 65 3c       if( nHPage<
20ae0 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29  (pMap->iFirst-1)
20af0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
20b00 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73  he database cons
20b10 69 73 74 65 64 20 6f 66 20 28 70 4d 61 70 2d 3e  isted of (pMap->
20b20 69 46 69 72 73 74 2d 31 29 20 70 61 67 65 73 20  iFirst-1) pages 
20b30 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
20b40 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63  .        ** conc
20b50 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
20b60 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 41  on was opened. A
20b70 6e 64 20 61 6e 20 63 6f 6e 63 75 72 72 65 6e 74  nd an concurrent
20b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
20b90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
20ba0 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e 20 61  be executed on a
20bb0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
20bc0 74 61 62 61 73 65 20 2d 20 73 6f 20 74 68 65 20  tabase - so the 
20bd0 64 62 20 73 68 6f 75 6c 64 20 0a 20 20 20 20 20  db should .     
20be0 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20 73     ** not have s
20bf0 68 72 75 6e 6b 20 73 69 6e 63 65 20 74 68 65 20  hrunk since the 
20c00 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
20c10 6f 70 65 6e 65 64 2e 20 54 68 65 72 65 66 6f 72  opened. Therefor
20c20 65 20 6e 48 50 61 67 65 0a 20 20 20 20 20 20 20  e nHPage.       
20c30 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 73 65   ** should be se
20c40 74 20 74 6f 20 28 70 4d 61 70 2d 3e 69 46 69 72  t to (pMap->iFir
20c50 73 74 2d 31 29 20 6f 72 20 67 72 65 61 74 65 72  st-1) or greater
20c60 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
20c70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
20c80 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
20c90 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
20ca0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
20cb0 61 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 64  action allocated
20cc0 20 70 61 67 65 73 20 70 4d 61 70 2d 3e 69 46 69   pages pMap->iFi
20cd0 72 73 74 20 74 68 72 6f 75 67 68 0a 20 20 20 20  rst through.    
20ce0 20 20 20 20 2a 2a 20 6e 50 61 67 65 20 28 69 6e      ** nPage (in
20cf0 63 6c 75 73 69 76 65 29 20 61 74 20 74 68 65 20  clusive) at the 
20d00 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
20d10 61 73 65 20 66 69 6c 65 2e 20 4d 65 61 6e 77 68  ase file. Meanwh
20d20 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
20d30 6f 74 68 65 72 20 74 72 61 6e 73 61 63 74 69 6f  other transactio
20d40 6e 73 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65  ns have allocate
20d50 64 20 28 69 46 69 72 73 74 2e 2e 6e 48 50 61 67  d (iFirst..nHPag
20d60 65 29 2e 20 53 6f 20 6d 6f 76 65 0a 20 20 20 20  e). So move.    
20d70 20 20 20 20 2a 2a 20 70 61 67 65 73 20 28 69 46      ** pages (iF
20d80 69 72 73 74 2e 2e 4d 49 4e 28 6e 50 61 67 65 2c  irst..MIN(nPage,
20d90 6e 48 50 61 67 65 29 29 20 74 6f 20 28 4d 41 58  nHPage)) to (MAX
20da0 28 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 2b 31  (nPage,nHPage)+1
20db0 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50  ).  */.        P
20dc0 67 6e 6f 20 69 4c 61 73 74 20 3d 20 4d 49 4e 28  gno iLast = MIN(
20dd0 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29 3b 20  nPage, nHPage); 
20de0 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
20df0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 20 20 20  to move */.     
20e00 20 20 20 50 67 6e 6f 20 6e 43 75 72 72 65 6e 74     Pgno nCurrent
20e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20e20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
20e30 74 20 73 69 7a 65 20 6f 66 20 64 62 20 2a 2f 0a  t size of db */.
20e40 20 20 20 20 20 20 20 20 6e 43 75 72 72 65 6e 74          nCurrent
20e50 20 3d 20 4d 41 58 28 6e 50 61 67 65 2c 20 6e 48   = MAX(nPage, nH
20e60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
20e70 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63 61 74  c = btreeRelocat
20e80 65 52 61 6e 67 65 28 70 42 74 2c 20 70 4d 61 70  eRange(pBt, pMap
20e90 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73 74 2c  ->iFirst, iLast,
20ea0 20 26 6e 43 75 72 72 65 6e 74 29 3b 0a 0a 20 20   &nCurrent);..  
20eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61        /* There a
20ec0 72 65 20 6e 6f 77 20 6e 6f 20 63 6f 6c 6c 69 73  re now no collis
20ed0 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 73 6e  ions with the sn
20ee0 61 70 73 68 6f 74 20 61 74 20 74 68 65 20 68 65  apshot at the he
20ef0 61 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ad of the.      
20f00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
20f10 6c 65 2e 20 53 6f 20 61 74 20 74 68 69 73 20 70  le. So at this p
20f20 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
20f30 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69   possible to wri
20f40 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  te.        ** th
20f50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 75  e transaction ou
20f60 74 20 74 6f 20 64 69 73 6b 2e 20 42 65 66 6f 72  t to disk. Befor
20f70 65 20 64 6f 69 6e 67 20 73 6f 20 74 68 6f 75 67  e doing so thoug
20f80 68 2c 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20  h, attempt to.  
20f90 20 20 20 20 20 20 2a 2a 20 72 65 6c 6f 63 61 74        ** relocat
20fa0 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6e 65  e some of the ne
20fb0 77 20 70 61 67 65 73 20 74 6f 20 66 72 65 65 20  w pages to free 
20fc0 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 69 6e  locations within
20fd0 20 74 68 65 20 62 6f 64 79 0a 20 20 20 20 20 20   the body.      
20fe0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
20ff0 62 61 73 65 20 66 69 6c 65 20 28 69 2e 65 2e 20  base file (i.e. 
21000 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65  free-list entrie
21010 73 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  s). */.        i
21020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
21040 73 65 72 74 28 20 6e 43 75 72 72 65 6e 74 21 3d  sert( nCurrent!=
21050 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
21060 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
21070 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21080 53 65 74 44 62 73 69 7a 65 28 70 42 74 2d 3e 70  SetDbsize(pBt->p
21090 50 61 67 65 72 2c 20 6e 43 75 72 72 65 6e 74 29  Pager, nCurrent)
210a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 46 72 65  ;.          nFre
210b0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31  e = get4byte(&p1
210c0 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  [36]);.         
210d0 20 6e 46 69 6e 20 3d 20 4d 41 58 28 6e 43 75 72   nFin = MAX(nCur
210e0 72 65 6e 74 2d 6e 46 72 65 65 2c 20 6e 48 50 61  rent-nFree, nHPa
210f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
21100 66 28 20 6e 43 75 72 72 65 6e 74 3e 50 45 4e 44  f( nCurrent>PEND
21110 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
21120 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44  t) && nFin<=PEND
21130 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
21140 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
21150 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20    nFin--;.      
21160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21170 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63 61  rc = btreeReloca
21180 74 65 52 61 6e 67 65 28 70 42 74 2c 20 6e 46 69  teRange(pBt, nFi
21190 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74 2c 20 30  n+1, nCurrent, 0
211a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
211b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
211c0 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  p1[28], nFin);. 
211d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
211e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
211f0 44 62 73 69 7a 65 28 70 50 61 67 65 72 2c 20 6e  Dbsize(pPager, n
21200 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Fin);.  }..  ret
21210 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
21220 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 46 69  # define btreeFi
21230 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20 20 53 51  xUnlocked(X)  SQ
21240 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f  LITE_OK.#endif /
21250 2a 20 45 4e 41 42 4c 45 5f 43 4f 4e 43 55 52 52  * ENABLE_CONCURR
21260 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ENT */../*.** Th
21270 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
21280 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
21290 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
212a0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
212b0 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
212c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
212d0 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
212e0 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
212f0 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
21300 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
21310 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
21320 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
21330 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
21340 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
21350 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
21360 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
21370 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
21380 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
21390 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
213a0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
213b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
213c0 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
213d0 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
213e0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
213f0 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
21400 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
21410 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
21420 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
21430 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
21440 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
21450 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
21460 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
21470 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
21480 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
21490 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
214a0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
214b0 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
214c0 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
214d0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
214e0 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
214f0 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
21500 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
21510 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
21520 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
21530 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
21540 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
21550 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
21560 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
21570 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
21580 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
21590 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
215a0 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
215b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
215c0 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
215d0 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
215e0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
215f0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
21600 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
21610 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
21620 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
21630 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
21640 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
21650 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
21660 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
21670 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
21680 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
21690 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
216a0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
216b0 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
216c0 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
216d0 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
216e0 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
216f0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
21700 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
21710 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
21720 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
21730 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
21740 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
21750 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
21760 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
21770 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
21780 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
21790 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
217a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
217b0 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
217c0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
217d0 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
217e0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
217f0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
21800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21810 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
21820 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
21830 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
21840 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
21850 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21860 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  r(p);..#ifndef S
21870 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21880 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
21890 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
218a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
218b0 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20 29  SCONCURRENT==0 )
218c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  ;.      rc = aut
218d0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
218e0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
218f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
21910 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
21920 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21940 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
21950 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
21960 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
21970 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
21980 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
21990 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
219a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
219b0 49 54 45 5f 4f 4b 20 26 26 20 49 53 43 4f 4e 43  ITE_OK && ISCONC
219c0 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  URRENT ){.      
219d0 72 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e 6c  rc = btreeFixUnl
219e0 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a  ocked(p);.    }.
219f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21a10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21a20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
21a30 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
21a40 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ter, 0);.    }. 
21a50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21a60 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
21a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21a80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21a90 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
21aa0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
21ab0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
21ac0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
21ad0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
21ae0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
21af0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
21b00 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
21b10 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
21b20 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
21b30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21b40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
21b50 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
21b60 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
21b70 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
21b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21b90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
21ba0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
21bb0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
21bc0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
21bd0 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
21be0 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
21bf0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
21c00 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
21c10 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
21c20 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
21c30 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
21c40 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
21c50 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
21c60 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
21c70 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
21c80 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
21c90 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
21ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
21cb0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
21cc0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
21cd0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
21ce0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
21cf0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
21d00 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
21d10 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
21d20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
21d30 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
21d40 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
21d50 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
21d60 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
21d70 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
21d80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
21d90 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
21da0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
21db0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
21dc0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
21dd0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
21de0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
21df0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
21e00 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
21e10 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
21e20 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
21e30 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
21e40 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21e50 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
21e60 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
21e70 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
21e80 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
21e90 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
21ea0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21eb0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
21ec0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21ed0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
21ee0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
21ef0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
21f00 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
21f10 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
21f20 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
21f30 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
21f40 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
21f50 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
21f60 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
21f70 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
21f80 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
21f90 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  d(pBt);.  }..  /
21fa0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
21fb0 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e   CONCURRENT tran
21fc0 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65 20  saction, delete 
21fd0 74 68 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f 62  the pBt->pMap ob
21fe0 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c 73 6f 20  ject..  ** Also 
21ff0 63 61 6c 6c 20 50 61 67 65 72 45 6e 64 43 6f 6e  call PagerEndCon
22000 63 75 72 72 65 6e 74 28 29 20 74 6f 20 65 6e 73  current() to ens
22010 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
22020 65 72 20 68 61 73 20 64 69 73 63 61 72 64 65 64  er has discarded
22030 0a 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64  .  ** the record
22040 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 72 65   of all pages re
22050 61 64 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ad within the tr
22060 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
22070 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65   btreePtrmapDele
22080 74 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  te(pBt);.  sqlit
22090 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72  e3PagerEndConcur
220a0 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rent(pBt->pPager
220b0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
220c0 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
220d0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
220e0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
220f0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
22100 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22110 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
22120 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
22130 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
22140 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
22150 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
22160 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
22170 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
22180 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
22190 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
221a0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
221b0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
221c0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
221d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
221e0 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
221f0 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
22200 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
22210 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
22220 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
22230 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
22240 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
22250 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
22260 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
22270 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
22280 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
22290 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
222a0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
222b0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
222c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
222d0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
222e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
222f0 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
22300 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
22310 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
22320 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22330 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
22340 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
22350 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
22360 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
22370 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
22380 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
22390 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
223a0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
223b0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
223c0 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
223d0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
223e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
223f0 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
22400 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
22410 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
22420 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
22430 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
22440 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
22450 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
22460 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
22470 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
22480 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
22490 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
224a0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
224b0 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
224c0 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
224d0 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
224e0 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
224f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
22500 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
22510 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
22520 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
22530 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
22540 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
22550 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
22560 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
22570 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
22580 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
22590 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
225a0 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
225b0 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
225c0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
225d0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
225e0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
225f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22600 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
22610 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
22620 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
22630 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
22640 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
22650 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
22660 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
22670 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
22680 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
22690 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
226a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
226b0 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
226c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
226d0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
226e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
226f0 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
22700 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
22710 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
22720 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
22730 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
22740 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
22750 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
22760 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
22770 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
22780 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
22790 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
227a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
227b0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
227c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
227d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
227e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
227f0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
22800 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
22810 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
22820 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
22830 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
22840 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
22850 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
22860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
22870 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
22880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22890 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
228a0 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
228b0 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
228c0 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
228d0 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
228e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
228f0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
22900 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
22910 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
22920 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
22930 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
22940 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
22950 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
22960 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22970 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
22980 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
22990 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
229a0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
229b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
229c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
229d0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
229e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
229f0 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
22a00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22a10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
22a20 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
22a30 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
22a40 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
22a50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
22a60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
22a80 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
22a90 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
22aa0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
22ab0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
22ac0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
22ad0 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
22ae0 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
22af0 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
22b00 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
22b10 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
22b20 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
22b30 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
22b40 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
22b50 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
22b60 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
22b70 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
22b80 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
22b90 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
22ba0 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
22bb0 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
22bc0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22bd0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
22be0 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
22bf0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
22c00 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
22c10 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
22c20 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
22c30 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
22c40 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
22c50 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
22c60 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
22c70 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
22c80 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
22c90 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
22ca0 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
22cb0 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
22cc0 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
22cd0 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
22ce0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
22cf0 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
22d00 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
22d10 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
22d20 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
22d30 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
22d40 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
22d50 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
22d60 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
22d70 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
22d80 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
22d90 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
22da0 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
22db0 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
22dc0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
22dd0 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
22de0 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
22df0 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
22e00 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
22e10 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
22e20 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
22e30 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
22e40 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
22e50 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
22e60 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
22e70 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
22e80 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
22e90 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
22ea0 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
22eb0 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
22ec0 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
22ed0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
22ee0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
22ef0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
22f00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
22f10 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
22f20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
22f30 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
22f40 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
22f50 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
22f60 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
22f70 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
22f80 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
22f90 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
22fa0 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
22fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
22fc0 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
22fd0 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
22fe0 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
22ff0 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
23000 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
23010 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
23020 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
23030 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
23040 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
23050 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
23060 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
23070 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
23080 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
23090 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
230a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
230b0 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
230c0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
230d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
230e0 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
230f0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
23100 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
23110 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23130 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
23140 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
23150 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
23160 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
23170 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23180 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23190 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
231a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
231b0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
231c0 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
231d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
231e0 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
231f0 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
23200 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
23210 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
23220 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
23230 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
23240 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
23250 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  i]);.        p->
23260 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
23270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23280 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
23290 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
232a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
232b0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
232c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
232d0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
232e0 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
232f0 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
23300 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
23310 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
23320 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
23330 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
23340 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
23350 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
23360 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
23370 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
23380 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
23390 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
233a0 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
233b0 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
233c0 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
233d0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
233e0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
233f0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
23400 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23410 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
23420 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
23430 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
23440 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
23450 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
23460 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
23470 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
23480 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
23490 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
234a0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
234b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
234c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
234d0 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
234e0 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
234f0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
23500 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
23510 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
23520 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
23530 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
23540 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
23550 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
23560 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
23570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
23580 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
23590 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
235a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
235b0 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
235c0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
235d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
235e0 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
235f0 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
23600 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
23610 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
23620 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
23630 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
23640 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
23650 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
23660 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
23670 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
23680 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
23690 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
236a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
236b0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
236c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
236d0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
236e0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
236f0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
23700 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
23710 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
23720 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
23730 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
23740 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
23750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23760 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
23770 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
23780 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
23790 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
237a0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
237b0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
237c0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
237d0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
237e0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
237f0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
23800 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
23810 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
23820 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
23830 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
23840 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
23850 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
23860 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
23870 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
23880 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
23890 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
238a0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
238b0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
238c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
238d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
238e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
238f0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
23900 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
23910 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
23920 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23930 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
23940 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
23950 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
23960 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
23970 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
23980 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
23990 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
239a0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
239b0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
239c0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
239d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
239e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
239f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
23a00 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
23a10 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
23a20 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
23a30 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
23a40 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
23a50 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
23a60 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
23a70 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
23a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
23a90 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
23aa0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
23ab0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
23ac0 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
23ad0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
23ae0 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
23af0 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
23b00 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
23b10 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
23b20 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
23b30 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
23b40 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
23b50 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
23b60 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
23b70 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
23b80 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
23b90 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
23ba0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
23bb0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
23bc0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
23bd0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
23be0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
23bf0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
23c00 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
23c10 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
23c20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23c30 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
23c40 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
23c50 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
23c60 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
23c70 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
23c80 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
23c90 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
23ca0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
23cb0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
23cc0 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
23cd0 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
23ce0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
23cf0 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
23d00 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
23d10 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
23d20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
23d30 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
23d40 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
23d50 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
23d60 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
23d70 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
23d80 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
23d90 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
23da0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
23db0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
23dc0 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
23dd0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
23de0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
23df0 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
23e00 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
23e10 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
23e20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
23e30 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
23e40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
23e50 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
23e60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
23e70 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
23e80 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23e90 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23ea0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
23eb0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
23ec0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
23ed0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
23ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
23ef0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
23f00 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
23f10 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
23f20 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
23f30 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
23f40 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
23f50 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
23f60 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
23f70 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
23f80 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
23f90 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
23fa0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
23fb0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
23fc0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
23fd0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
23fe0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
23ff0 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
24000 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
24010 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
24020 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
24030 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
24040 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
24050 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
24060 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ment);.  if( rc=
24070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24080 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d    rc = btreePtrm
24090 61 70 42 65 67 69 6e 28 70 42 74 2c 20 69 53 74  apBegin(pBt, iSt
240a0 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  atement);.  }.  
240b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
240c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
240d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
240e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
240f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
24100 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
24110 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
24120 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
24130 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
24140 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
24150 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
24160 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
24170 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
24180 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
24190 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
241a0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
241b0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
241c0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
241d0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
241e0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
241f0 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
24200 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
24210 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
24220 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
24230 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
24240 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
24250 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
24260 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
24270 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
24280 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
24290 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
242a0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
242b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
242c0 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
242d0 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
242e0 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
242f0 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
24300 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
24310 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
24320 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
24330 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
24340 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
24350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
24360 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
24370 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
24380 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
24390 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
243a0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
243b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
243c0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
243d0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
243e0 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
243f0 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
24400 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
24410 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
24420 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
24430 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
24440 0a 20 20 20 20 62 74 72 65 65 50 74 72 6d 61 70  .    btreePtrmap
24450 45 6e 64 28 70 42 74 2c 20 6f 70 2c 20 69 53 61  End(pBt, op, iSa
24460 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 72 63  vepoint);.    rc
24470 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
24480 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
24490 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
244a0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
244b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
244c0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
244d0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
244e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
244f0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
24500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
24510 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
24520 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
24530 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
24540 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
24550 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
24560 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
24570 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
24580 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24590 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
245a0 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
245b0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
245c0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
245d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
245e0 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
245f0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
24600 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
24610 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
24620 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
24630 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
24640 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
24650 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24660 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
24670 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24680 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
24690 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
246a0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
246b0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
246c0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
246d0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
246e0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
246f0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
24700 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
24710 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
24720 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
24730 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
24740 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24750 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
24760 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
24770 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
24780 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
24790 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
247a0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
247b0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
247c0 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
247d0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
247e0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
247f0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
24800 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
24810 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
24820 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
24830 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
24840 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
24850 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
24860 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
24870 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
24880 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
24890 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
248a0 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
248b0 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
248c0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
248d0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
248e0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
248f0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
24900 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
24910 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
24920 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
24930 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
24940 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
24950 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
24960 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
24970 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
24980 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
24990 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
249a0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
249b0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
249c0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
249d0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
249e0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
249f0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
24a00 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
24a10 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
24a20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
24a30 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
24a40 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
24a50 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
24a60 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
24a70 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
24a80 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
24a90 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
24aa0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
24ab0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
24ac0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
24ad0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
24ae0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
24af0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
24b00 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
24b10 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
24b20 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
24b30 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
24b40 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
24b50 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
24b60 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
24b70 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
24b80 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
24b90 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
24ba0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
24bb0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
24bc0 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
24bd0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
24be0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
24bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
24c00 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
24c10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
24c40 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
24c70 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
24c80 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
24c90 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
24cc0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
24cd0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
24ce0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24d00 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
24d10 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
24d20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
24d30 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
24d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24d50 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
24d60 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
24d70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24d80 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
24d90 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
24da0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
24db0 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
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 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
24de0 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
24df0 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
24e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
24e10 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
24e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
24e30 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
24e40 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
24e50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
24e60 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
24e70 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
24e80 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
24e90 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
24ea0 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
24eb0 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24ec0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
24ed0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
24ee0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
24ef0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
24f00 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
24f10 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
24f20 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
24f30 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
24f40 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
24f50 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
24f60 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
24f70 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
24f80 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24f90 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
24fa0 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
24fb0 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
24fc0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
24fd0 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
24fe0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
24ff0 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
25000 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
25010 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
25020 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
25030 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
25040 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
25050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
25060 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
25070 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
25080 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
25090 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62  ag==0 || (pBt->b
250a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
250b0 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a  AD_ONLY)==0 );..
250c0 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
250d0 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
250e0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
250f0 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
25100 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
25110 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
25120 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
25130 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
25140 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
25150 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
25160 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
25170 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
25180 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
25190 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
251a0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
251b0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
251c0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
251d0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
251e0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
251f0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
25200 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
25210 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
25220 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
25230 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
25240 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
25250 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
25260 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
25270 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73  >pBt = pBt;.  as
25280 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
25290 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f  || wrFlag==BTCF_
252a0 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70  WriteFlag );.  p
252b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
252c0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
252d0 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20  curPagerFlags = 
252e0 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47  wrFlag ? 0 : PAG
252f0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b  ER_GET_READONLY;
25300 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
25310 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  re two or more c
25320 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61  ursors on the sa
25330 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61  me btree, then a
25340 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72  ll such.  ** cur
25350 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65  sors *must* have
25360 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
25370 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a  le flag set. */.
25380 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43    for(pX=pBt->pC
25390 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58  ursor; pX; pX=pX
253a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
253b0 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  ( pX->pgnoRoot==
253c0 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a  (Pgno)iTable ){.
253d0 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61        pX->curFla
253e0 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
253f0 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ple;.      pCur-
25400 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
25410 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
25420 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e  }.  }.  pCur->pN
25430 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
25440 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  or;.  pBt->pCurs
25450 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
25460 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
25470 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
25480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25490 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
254a0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
254b0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
254e0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
254f0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25510 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
25520 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
25530 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
25540 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
25570 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
25580 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
25590 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255b0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
255c0 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
255d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25600 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
25610 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
25620 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62  t rc;.  if( iTab
25630 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  le<1 ){.    rc =
25640 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25650 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
25660 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
25670 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
25680 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
25690 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
256a0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
256b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
256c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
256d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
256e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
256f0 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
25700 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
25710 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
25720 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
25730 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
25740 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
25750 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
25760 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
25770 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
25780 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
25790 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
257a0 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
257b0 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
257c0 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
257d0 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
257e0 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
257f0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
25800 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25810 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
25820 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
25830 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
25840 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
25850 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
25860 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
25870 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
25880 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
25890 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
258a0 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
258b0 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
258c0 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
258d0 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
258e0 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
258f0 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
25900 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
25910 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
25920 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
25930 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
25940 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
25950 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
25960 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
25970 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
25980 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
25990 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
259a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
259b0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
259c0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
259d0 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
259e0 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
259f0 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
25a00 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
25a10 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
25a20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25a30 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
25a40 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
25a50 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
25a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25a70 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
25a80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25a90 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
25aa0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
25ab0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
25ac0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
25ad0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
25ae0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
25af0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
25b00 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
25b10 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
25b20 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
25b30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
25b40 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
25b50 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
25b60 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  r==pCur ){.     
25b70 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
25b80 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
25b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74   }else{.      Bt
25ba0 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20  Cursor *pPrev = 
25bb0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
25bc0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
25bd0 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  if( pPrev->pNext
25be0 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
25bf0 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74      pPrev->pNext
25c00 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
25c10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
25c20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25c30 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76     pPrev = pPrev
25c40 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
25c50 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50  while( ALWAYS(pP
25c60 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  rev) );.    }.  
25c70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
25c80 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
25c90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
25ca0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
25cb0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
25cc0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
25cd0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
25ce0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
25cf0 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
25d00 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
25d10 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
25d20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25d30 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
25d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
25d60 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
25d70 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
25d80 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
25d90 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
25da0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
25db0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
25dc0 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
25dd0 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
25de0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
25df0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
25e00 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
25e10 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
25e20 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
25e30 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
25e40 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
25e50 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
25e60 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
25e70 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
25e80 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
25e90 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
25ea0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
25eb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25ec0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
25ed0 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
25ee0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
25ef0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
25f00 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
25f10 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
25f20 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
25f30 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
25f40 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
25f50 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
25f60 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
25f70 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  || memcmp(&info,
25f80 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
25f90 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
25fa0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
25fb0 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
25fc0 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
25fd0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
25fe0 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
25ff0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
26000 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
26010 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
26020 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  0 ){.    int iPa
26030 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
26040 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  ;.    pCur->curF
26050 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
26060 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
26070 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
26080 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
26090 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
260a0 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  ],&pCur->info);.
260b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
260c0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
260d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
260e0 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
260f0 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
26100 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
26110 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
26120 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
26130 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
26140 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
26150 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
26160 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
26170 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
26180 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
26190 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
261a0 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
261b0 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
261c0 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
261d0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
261e0 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
261f0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
26200 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
26210 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
26220 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
26230 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
26240 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26250 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
26260 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
26270 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
26280 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
26290 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
262a0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
262b0 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
262c0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
262d0 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
262e0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
262f0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
26300 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
26310 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
26320 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
26330 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
26340 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
26350 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
26360 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
26370 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
26380 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
26390 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
263a0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
263b0 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
263c0 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
263d0 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
263e0 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
263f0 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
26400 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
26410 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
26420 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
26430 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
26440 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
26450 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
26460 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26470 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26480 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26490 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
264a0 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
264b0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
264c0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
264d0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72  fo.nKey;.  retur
264e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
264f0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
26500 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
26510 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
26520 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
26530 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
26540 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
26550 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
26560 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
26570 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
26580 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
26590 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
265a0 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
265b0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
265c0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
265d0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
265e0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
265f0 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
26600 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26610 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
26620 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
26630 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
26640 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
26650 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
26660 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
26670 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
26680 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
26690 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
266a0 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
266b0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
266c0 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
266d0 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
266e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
266f0 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
26700 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
26710 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
26720 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26730 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26740 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
26750 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26760 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
26770 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
26780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26790 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
267a0 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
267b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
267c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
267d0 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31  ]->intKeyLeaf==1
267e0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
267f0 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
26800 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
26810 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
26820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26830 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
26840 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
26850 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
26860 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
26870 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
26880 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
26890 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
268a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
268b0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
268c0 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
268d0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
268e0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
268f0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
26900 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
26910 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
26920 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
26930 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
26940 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
26950 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
26960 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
26970 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26980 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
26990 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
269a0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
269b0 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
269c0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
269d0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
269e0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
269f0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
26a00 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
26a10 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
26a20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
26a30 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
26a40 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
26a50 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
26a60 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
26a70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
26a80 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
26a90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
26aa0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
26ab0 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
26ac0 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
26ad0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
26ae0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
26af0 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
26b00 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
26b10 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
26b20 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
26b30 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
26b40 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
26b50 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
26b60 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
26b70 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
26b80 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
26b90 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
26ba0 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
26bb0 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
26bc0 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
26bd0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
26be0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
26bf0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
26c00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
26c30 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
26c40 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
26c50 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
26c60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
26c70 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
26c80 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
26c90 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
26ca0 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
26cb0 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
26cc0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ce0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
26cf0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
26d00 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
26d10 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
26d20 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
26d30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26d40 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
26d50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26d60 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
26d70 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
26d80 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
26d90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26da0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
26db0 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
26dc0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
26dd0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
26de0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
26df0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
26e00 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
26e10 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
26e20 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
26e30 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
26e40 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
26e50 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
26e60 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
26e70 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
26e80 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
26e90 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
26ea0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
26eb0 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
26ec0 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
26ed0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
26ee0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26ef0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
26f00 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
26f10 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
26f20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
26f30 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
26f40 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
26f50 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
26f60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26f70 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
26f80 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
26f90 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
26fa0 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
26fb0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
26fc0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
26fd0 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
26fe0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
26ff0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27000 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
27010 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
27020 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
27030 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
27040 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
27050 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
27060 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27070 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
27080 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
27090 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
270a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
270b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
270c0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
270d0 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
270e0 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50   (ppPage==0) ? P
270f0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
27100 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  Y : 0);.    asse
27110 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
27120 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b  K || pPage==0 );
27130 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
27140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27150 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
27160 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
27170 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
27180 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
27190 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
271a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
271b0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
271c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
271d0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
271e0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
271f0 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
27200 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
27210 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
27220 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
27230 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
27240 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
27250 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
27260 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
27270 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
27280 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
27290 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
272a0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
272b0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
272c0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
272d0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
272e0 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
272f0 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
27300 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
27310 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
27320 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27330 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
27340 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
27350 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
27360 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
27370 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
27380 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
27390 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
273a0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
273b0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
273c0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
273d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
273e0 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
273f0 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
27400 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
27410 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
27420 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27440 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
27450 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
27460 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
27470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27480 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
27490 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
274b0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
274c0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
274d0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
274e0 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
274f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
27500 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
27510 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
27520 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
27530 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
27540 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
27550 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
27560 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
27570 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27580 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
27590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
275a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
275b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
275c0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
275d0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
275e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
275f0 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
27600 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
27610 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
27620 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
27630 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
27640 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
27650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27660 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27670 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
27680 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
27690 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
276a0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
276b0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
276c0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
276d0 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f  nting to. The eO
276e0 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  p.** argument is
276f0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
27700 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
27710 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   0: The operatio
27720 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70  n is a read. Pop
27730 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
27740 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31  ow cache..**   1
27750 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
27760 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75  is a write. Popu
27770 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
27780 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a  w cache..**   2:
27790 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
277a0 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74  s a read. Do not
277b0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
277c0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
277d0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
277e0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
277f0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
27800 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
27810 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
27820 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
27830 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
27840 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
27850 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
27860 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
27870 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
27880 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
27890 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
278a0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
278b0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
278c0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
278d0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
278e0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
278f0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64  erflow pages and
27900 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75   the.** eOp argu
27910 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74  ment is not 2, t
27920 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
27930 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
27940 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a  for and lazily .
27950 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65  ** populates the
27960 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
27970 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20  ist cache array 
27980 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
27990 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71  low). .** Subseq
279a0 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
279b0 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  his cache to mak
279c0 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
279d0 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
279e0 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69   .** more effici
279f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
27a00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27a10 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
27a20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
27a30 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
27a40 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
27a50 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
27a60 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
27a70 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
27a80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
27a90 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
27aa0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
27ab0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
27ac0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
27ad0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
27ae0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
27af0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
27b00 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
27b10 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
27b20 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
27b30 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
27b40 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
27b50 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
27b60 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
27b70 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
27b80 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
27b90 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
27ba0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
27bb0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
27bc0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
27bd0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
27be0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
27bf0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
27c00 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
27c10 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
27c20 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
27c30 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
27c40 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
27c50 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
27c60 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
27c70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27c80 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
27c90 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
27ca0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
27cb0 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
27cc0 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
27cd0 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
27ce0 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
27cf0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27d00 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
27d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27d20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
27d30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27d40 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27d50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
27d60 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
27d70 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
27d80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
27d90 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
27da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27db0 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
27dc0 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
27dd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
27de0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
27df0 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  EAD.  unsigned c
27e00 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66  har * const pBuf
27e10 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
27e20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20  int bEnd;       
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27e50 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20  e if reading to 
27e60 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23  end of data */.#
27e70 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
27e80 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
27e90 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27ea0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27ec0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27ed0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
27ee0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
27ef0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27f00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27f10 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66  t( eOp!=2 || off
27f20 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
27f30 41 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f  Always start fro
27f40 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20  m beginning for 
27f50 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74  eOp==2 */..  get
27f60 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
27f70 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
27f80 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27f90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
27fa0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
27fb0 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66  READ.  bEnd = of
27fc0 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e  fset+amt==pCur->
27fd0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23  info.nPayload;.#
27fe0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
27ff0 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43  offset+amt <= pC
28000 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
28010 64 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61  d );..  if( &aPa
28020 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
28030 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
28040 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
28050 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ableSize] ){.   
28060 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
28070 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
28080 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
28090 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
280a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
280b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
280c0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
280d0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
280e0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
280f0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
28100 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
28110 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
28120 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
28130 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
28140 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
28150 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
28160 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
28170 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
28180 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
28190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
281a0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
281b0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
281c0 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20  pBuf, a, (eOp & 
281d0 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44  0x01), pPage->pD
281e0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
281f0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
28200 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
28210 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
28220 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
28230 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
28240 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
28250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
28260 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
28270 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
28280 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
28290 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
282a0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
282b0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
282c0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
282d0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
282e0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
282f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
28300 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
28310 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
28320 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
28330 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
28340 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
28350 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
28360 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76  not allocate aOv
28370 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70  erflow[] for eOp
28380 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ==2..    **.    
28390 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
283a0 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
283b0 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
283c0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
283d0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
283e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
283f0 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
28400 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
28410 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
28420 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
28430 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
28440 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
28450 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
28460 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
28470 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
28480 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
28490 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
284a0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
284b0 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20  .    if( eOp!=2 
284c0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
284d0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
284e0 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
284f0 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
28500 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
28510 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
28520 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
28530 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
28540 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e  if( nOvfl>pCur->
28550 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  nOvflAlloc ){.  
28560 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
28570 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
28580 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
28590 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
285a0 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
285b0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
285c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
285d0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
285e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
285f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
28600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28610 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
28620 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
28630 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
28640 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
28650 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28660 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
28670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28680 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
28690 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
286a0 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
286b0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gno));.        p
286c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
286d0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
286e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
286f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
28700 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
28710 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
28720 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
28730 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
28740 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
28750 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
28760 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
28770 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
28780 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
28790 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
287a0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
287b0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20  ValidOvfl)!=0.  
287c0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65     && pCur->aOve
287d0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
287e0 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20  lSize].    ){.  
287f0 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
28800 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
28810 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
28820 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28830 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
28840 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
28850 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  lSize);.    }.. 
28860 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
28870 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
28880 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
28890 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a  dx++){..      /*
288a0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
288b0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
288c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
288d0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
288e0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
288f0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
28900 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)!=0 ){.      
28910 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
28920 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
28930 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
28940 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
28950 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
28960 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28970 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
28980 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
28990 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
289a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
289b0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
289c0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
289d0 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
289e0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
289f0 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
28a00 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
28a10 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
28a20 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
28a30 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
28a40 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
28a50 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
28a60 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
28a70 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
28a80 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
28a90 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
28aa0 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
28ab0 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
28ac0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
28ad0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
28ae0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
28af0 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  at the aOverflow
28b00 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65  [] array must be
28b10 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75   allocated becau
28b20 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20  se eOp!=2.      
28b30 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65    ** here.  If e
28b40 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73  Op==2, then offs
28b50 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62  et==0 and this b
28b60 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74  ranch is never t
28b70 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aken..        */
28b80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28b90 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20   eOp!=2 );.     
28ba0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28bb0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28bc0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
28bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28be0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
28bf0 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
28c00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
28c10 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
28c20 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
28c30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
28c40 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
28c50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28c60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
28c70 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
28c80 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
28c90 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
28ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
28cb0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
28cc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28cd0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
28ce0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
28cf0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
28d00 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
28d10 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
28d20 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
28d30 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
28d40 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
28d50 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
28d60 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
28d70 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
28d80 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
28d90 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
28da0 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
28db0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
28dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
28dd0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
28de0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
28df0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
28e00 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
28e10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
28e20 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
28e30 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
28e40 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
28e50 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
28e60 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28e70 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
28e80 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
28e90 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
28ea0 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
28eb0 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
28ec0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
28ed0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
28ee0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
28ef0 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
28f00 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
28f10 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
28f20 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
28f30 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
28f40 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
28f50 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
28f60 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
28f70 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
28f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
28f90 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
28fa0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
28fb0 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a   read..        *
28fc0 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20  *   7) at least 
28fd0 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
28fe0 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
28ff0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
29000 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
29010 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
29020 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
29030 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
29040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29050 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
29060 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
29070 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
29080 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
29090 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
290a0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
290b0 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
290c0 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
290d0 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
290e0 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
290f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
29100 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20   (eOp&0x01)==0  
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
29140 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
29150 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29180 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
29190 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f  && (bEnd || a==o
291a0 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20  vflSize)        
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
291d0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
291e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
291f0 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20  TRANS_READ      
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29210 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
29220 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74    && (fd = sqlit
29230 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
29240 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68  >pPager))->pMeth
29250 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a  ods     /* (3) *
29260 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
29270 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
29280 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20  [19]==0x01      
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292a0 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20   /* (5) */.     
292b0 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
292c0 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29            /* (7)
292f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
29300 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
29310 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
29320 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
29330 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
29340 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
29350 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20         /* hence 
29380 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (7) */.         
29390 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
293a0 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
293b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
293c0 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
293d0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
293e0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
293f0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
29400 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
29410 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
29420 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
29430 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
29440 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
29450 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
29460 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
29470 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
29480 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29490 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
294a0 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
294b0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
294c0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
294d0 20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d     ((eOp&0x01)==
294e0 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
294f0 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
29500 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29510 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29530 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
29540 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
29550 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
29560 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
29570 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
29580 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
29590 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
295a0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
295b0 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
295c0 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70  a, (eOp&0x01), p
295d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
295e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
295f0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
29600 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
29610 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
29620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29630 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
29640 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
29650 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
29660 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
29670 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
29680 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
29690 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
296a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
296b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
296c0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
296d0 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
296e0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
296f0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
29700 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
29710 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69  be transferred i
29720 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
29730 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
29740 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
29750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
29760 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
29770 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
29780 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
29790 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
297a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
297b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
297c0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
297d0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
297e0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
297f0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
29800 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
29810 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
29820 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
29830 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
29840 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29850 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
29860 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
29870 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
29880 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
29890 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
298a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
298b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
298c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
298d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
298e0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
298f0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
29900 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
29910 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29920 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29930 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
29940 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
29950 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
29960 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
29970 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
29980 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
29990 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
299a0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
299b0 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
299c0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
299d0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
299e0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
299f0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
29a00 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
29a10 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
29a20 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
29a30 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
29a40 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
29a50 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
29a60 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
29a70 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
29a80 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
29a90 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
29aa0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
29ab0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
29ac0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
29ad0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
29ae0 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
29af0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
29b00 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
29b10 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
29b20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
29b30 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
29b40 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
29b50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
29b60 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
29b70 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
29b80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
29b90 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29ba0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29bb0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
29bc0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
29bd0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
29be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29bf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29c00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29c10 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
29c20 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
29c30 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
29c40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
29c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
29c60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29c70 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
29c80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29c90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
29ca0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
29cb0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
29cc0 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
29cd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29cf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
29d00 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
29d10 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
29d20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
29d30 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
29d40 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
29d50 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
29d60 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
29d70 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
29d80 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
29d90 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
29da0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
29db0 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
29dc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
29dd0 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
29de0 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
29df0 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
29e00 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29e10 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
29e20 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
29e30 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
29e40 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
29e50 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
29e60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29e70 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
29e80 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
29e90 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
29ea0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
29eb0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
29ec0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
29ed0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
29ee0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
29ef0 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
29f00 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
29f10 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
29f20 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
29f30 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
29f40 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
29f50 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
29f60 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
29f70 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
29f80 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
29f90 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
29fa0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
29fb0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
29fc0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
29fd0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
29fe0 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
29ff0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
2a000 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
2a010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
2a020 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
2a030 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
2a040 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
2a050 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
2a060 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
2a070 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
2a080 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
2a090 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2a0a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
2a0b0 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
2a0c0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
2a0d0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
2a0e0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
2a0f0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
2a100 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
2a110 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
2a120 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
2a130 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
2a140 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
2a150 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20  ){.  u32 amt;.  
2a160 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
2a170 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
2a180 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
2a190 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
2a1a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a1b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a1c0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2a1d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a1e0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2a1f0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2a200 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2a210 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2a220 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a230 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a240 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
2a250 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a260 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  e]->nCell );.  a
2a270 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a280 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61  o.nSize>0 );.  a
2a290 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a2a0 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d  o.pPayload>pCur-
2a2b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a2c0 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43  age]->aData || C
2a2d0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
2a2e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a2f0 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
2a300 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a310 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c  age]->aDataEnd |
2a320 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20  |CORRUPT_DB);.  
2a330 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72  amt = (int)(pCur
2a340 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a350 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20  Page]->aDataEnd 
2a360 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  - pCur->info.pPa
2a370 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43  yload);.  if( pC
2a380 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  ur->info.nLocal<
2a390 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72  amt ) amt = pCur
2a3a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
2a3b0 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20   *pAmt = amt;.  
2a3c0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
2a3d0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a3e0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
2a3f0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
2a400 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
2a410 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
2a420 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
2a430 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
2a440 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
2a450 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
2a460 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
2a470 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
2a480 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
2a490 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
2a4a0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
2a4b0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
2a4c0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
2a4d0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
2a4e0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
2a4f0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
2a500 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
2a510 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
2a520 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
2a530 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
2a540 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
2a550 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
2a560 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
2a570 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
2a580 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
2a590 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
2a5a0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
2a5b0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2a5c0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
2a5d0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
2a5e0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
2a5f0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
2a600 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
2a610 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2a620 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
2a630 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
2a640 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
2a650 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
2a660 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
2a670 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
2a680 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73  r, pAmt);.}.cons
2a690 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
2a6a0 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
2a6b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2a6c0 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
2a6d0 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
2a6e0 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
2a6f0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2a700 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
2a710 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
2a720 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
2a730 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
2a740 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2a750 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
2a760 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
2a770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
2a780 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
2a790 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
2a7a0 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
2a7b0 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
2a7c0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
2a7d0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
2a7e0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
2a7f0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
2a800 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
2a810 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
2a820 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
2a830 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
2a840 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
2a850 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
2a860 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
2a870 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
2a880 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
2a890 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2a8a0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
2a8b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2a8c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2a8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a8e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a8f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2a900 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
2a910 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
2a920 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
2a930 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2a940 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
2a950 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
2a960 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
2a970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a980 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2a990 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   }.  pCur->info.
2a9a0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a9b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a9c0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2a9d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2a9e0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
2a9f0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
2aa00 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30  pCur->iPage] = 0
2aa10 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e  ;.  return getAn
2aa20 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
2aa30 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61  ewPgno, &pCur->a
2aa40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2aa50 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2aa70 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
2aa80 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53  Flags);.}..#if S
2aa90 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2aaa0 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
2aab0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
2aac0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
2aad0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
2aae0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
2aaf0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
2ab00 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
2ab10 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
2ab20 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
2ab30 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
2ab40 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
2ab50 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
2ab60 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
2ab70 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
2ab80 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2ab90 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2aba0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
2abb0 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
2abc0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
2abd0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
2abe0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
2abf0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
2ac00 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
2ac10 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
2ac20 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
2ac30 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
2ac40 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
2ac50 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
2ac80 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
2ac90 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
2aca0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
2acb0 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
2acc0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2acd0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2ace0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2acf0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2ad00 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
2ad10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ad20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2ad30 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
2ad40 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
2ad50 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
2ad60 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
2ad70 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
2ad80 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
2ad90 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2ada0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
2adb0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
2adc0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2add0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
2ade0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
2adf0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
2ae00 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
2ae10 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
2ae20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
2ae30 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
2ae40 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
2ae50 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
2ae60 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
2ae70 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
2ae80 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
2ae90 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
2aea0 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
2aeb0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2aec0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2aed0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2aee0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2aef0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2af00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2af10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2af20 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
2af30 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2af40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
2af50 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
2af60 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
2af70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2af80 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
2af90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2afa0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
2afb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2afc0 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
2afd0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  ;.  testcase( pC
2afe0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2aff0 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
2b000 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b010 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
2b020 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2b030 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2b040 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2b050 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2b060 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2b070 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2b080 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
2b090 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
2b0a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2b0b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
2b0c0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
2b0d0 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
2b0e0 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
2b0f0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
2b100 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
2b110 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
2b120 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
2b130 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
2b140 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
2b150 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
2b160 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
2b170 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
2b180 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
2b190 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
2b1a0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2b1b0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2b1c0 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
2b1d0 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
2b1e0 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
2b1f0 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
2b200 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2b210 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
2b220 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
2b230 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
2b240 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
2b250 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
2b260 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
2b270 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
2b280 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
2b290 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
2b2a0 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
2b2b0 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
2b2c0 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
2b2d0 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
2b2e0 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
2b2f0 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
2b300 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
2b310 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2b320 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
2b330 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
2b340 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
2b350 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
2b360 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
2b370 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
2b380 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
2b390 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
2b3a0 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
2b3b0 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
2b3c0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
2b3d0 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
2b3e0 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
2b3f0 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
2b400 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
2b410 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
2b420 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
2b430 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
2b440 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
2b450 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
2b460 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
2b470 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
2b480 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
2b490 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
2b4a0 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
2b4b0 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
2b4c0 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
2b4d0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
2b4e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2b4f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
2b500 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
2b510 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2b520 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2b530 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2b540 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
2b550 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
2b560 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
2b570 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2b580 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
2b590 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2b5a0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2b5b0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
2b5c0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2b5d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2b5e0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
2b5f0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
2b600 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2b610 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2b620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b630 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
2b640 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2b650 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2b660 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
2b670 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
2b680 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2b690 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
2b6a0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
2b6b0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2b6c0 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61  iPage ){.      a
2b6d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2b6e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2b6f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c  !=0 );.      rel
2b700 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
2b710 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b720 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
2b730 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2b740 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2b750 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
2b760 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2b770 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75  NVALID;.    retu
2b780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b790 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2b7a0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
2b7b0 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  (-1) );.    rc =
2b7c0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2b7d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2b7e0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2b7f0 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
2b800 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
2b820 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
2b830 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
2b840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b850 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2b860 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2b870 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
2b880 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2b890 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
2b8a0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74      pCur->curInt
2b8b0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  Key = pCur->apPa
2b8c0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20  ge[0]->intKey;. 
2b8d0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
2b8e0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
2b8f0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
2b900 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
2b910 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  oot );..  /* If 
2b920 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
2b930 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2b940 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
2b950 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
2b960 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65  sor.  ** expecte
2b970 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
2b980 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
2b990 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
2b9a0 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20  KeyInfo is.  ** 
2b9b0 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
2b9c0 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
2b9d0 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
2b9e0 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
2b9f0 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e  ,.  ** return an
2ba00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2ba10 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a  error. .  **.  *
2ba20 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  * Earlier versio
2ba30 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73  ns of SQLite ass
2ba40 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74  umed that this t
2ba50 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61  est could not fa
2ba60 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72  il.  ** if the r
2ba70 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72  oot page was alr
2ba80 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e  eady loaded when
2ba90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2baa0 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a  as called (i.e..
2bab0 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50    ** if pCur->iP
2bac0 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69  age>=0). But thi
2bad0 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74  s is not so if t
2bae0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2baf0 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69  orrupted .  ** i
2bb00 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
2bb10 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20  t page pRoot is 
2bb20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65  linked into a se
2bb30 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c  cond b-tree tabl
2bb40 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20  e .  ** (or the 
2bb50 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20  freelist).  */. 
2bb60 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
2bb70 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f  intKey==1 || pRo
2bb80 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  ot->intKey==0 );
2bb90 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73  .  if( pRoot->is
2bba0 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Init==0 || (pCur
2bbb0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d  ->pKeyInfo==0)!=
2bbc0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b  pRoot->intKey ){
2bbd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2bbe0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2bbf0 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69  .  }..  pCur->ai
2bc00 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
2bc10 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2bc20 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2bc30 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2bc40 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2bc50 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2bc60 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f  vfl);..  if( pRo
2bc70 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
2bc80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2bc90 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2bca0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
2bcb0 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
2bcc0 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
2bcd0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
2bce0 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
2bcf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2bd00 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
2bd10 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
2bd20 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
2bd30 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2bd40 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2bd50 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2bd60 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2bd70 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
2bd80 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2bd90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2bda0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2bdb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bdc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2bdd0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2bde0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
2bdf0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2be00 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
2be10 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2be20 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2be30 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
2be40 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
2be50 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2be60 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
2be70 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
2be80 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2be90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2bea0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
2beb0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2bec0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2bed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2bef0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2bf00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2bf10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2bf20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2bf30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2bf40 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2bf50 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
2bf60 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2bf70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
2bf80 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
2bf90 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2bfa0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
2bfb0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2bfc0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2bfd0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2bfe0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bff0 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
2c000 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2c010 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2c020 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c030 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2c040 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
2c050 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2c060 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2c070 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
2c080 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
2c090 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2c0a0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
2c0b0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
2c0c0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
2c0d0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
2c0e0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
2c0f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
2c100 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
2c110 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2c120 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
2c130 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
2c140 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
2c150 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2c160 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2c170 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
2c180 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
2c190 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
2c1a0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2c1b0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
2c1c0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
2c1d0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
2c1e0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
2c1f0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
2c200 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2c210 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2c220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c230 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2c240 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2c250 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2c260 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c270 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c280 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2c290 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
2c2a0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2c2b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
2c2c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2c2d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2c2e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c2f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2c300 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c310 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
2c320 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2c330 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2c340 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2c350 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2c360 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
2c370 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c380 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
2c390 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
2c3a0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2c3b0 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
2c3c0 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2c3d0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2c3e0 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
2c3f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c400 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2c410 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
2c420 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2c430 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2c440 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2c450 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2c460 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2c470 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2c480 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2c490 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2c4a0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2c4b0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2c4c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c4d0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
2c4e0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2c4f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2c500 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2c510 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2c520 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2c530 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c540 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2c550 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2c560 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2c570 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2c580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2c590 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2c5a0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2c5b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c5c0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2c5d0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2c5e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c5f0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2c600 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2c610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2c620 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2c630 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2c640 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2c650 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c660 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2c670 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2c680 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2c690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2c6a0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2c6b0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c6c0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2c6d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2c6e0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2c6f0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2c700 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2c710 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2c720 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2c730 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2c740 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2c750 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2c760 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2c770 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c780 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2c790 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2c7a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2c7b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2c7c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c7d0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2c7e0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2c7f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2c800 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
2c810 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
2c820 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
2c830 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
2c840 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2c850 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
2c860 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c870 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2c880 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2c890 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
2c8a0 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
2c8b0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
2c8c0 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
2c8d0 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
2c8e0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
2c8f0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2c900 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
2c910 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
2c920 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
2c930 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
2c940 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c950 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
2c960 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
2c970 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
2c980 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2c990 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c9a0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
2c9b0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2c9c0 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
2c9d0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2c9e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
2c9f0 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
2ca00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ca10 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
2ca20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2ca30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ca40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2ca50 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2ca60 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2ca70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ca80 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2ca90 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2caa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2cab0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
2cac0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2cad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2cae0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2caf0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2cb00 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2cb10 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
2cb20 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2cb30 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
2cb40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cb50 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
2cb60 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2cb70 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65  AtLast;.      }e
2cb80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75  lse{.        pCu
2cb90 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2cba0 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2cbb0 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20     }.   .    }. 
2cbc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2cbd0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2cbe0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
2cbf0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
2cc00 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
2cc10 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
2cc20 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
2cc30 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
2cc40 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
2cc50 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
2cc60 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
2cc70 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
2cc80 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
2cc90 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
2cca0 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2ccb0 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
2ccc0 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
2ccd0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
2cce0 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
2ccf0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
2cd00 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
2cd10 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
2cd20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2cd30 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
2cd40 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
2cd50 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
2cd60 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
2cd70 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
2cd80 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
2cd90 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
2cda0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
2cdb0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
2cdc0 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
2cdd0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
2cde0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
2cdf0 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
2ce00 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
2ce10 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
2ce20 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
2ce30 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
2ce40 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
2ce50 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
2ce60 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
2ce70 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
2ce80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
2ce90 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
2cea0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2ceb0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2cec0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2ced0 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
2cee0 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
2cef0 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
2cf00 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2cf10 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
2cf20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
2cf30 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
2cf40 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
2cf50 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
2cf60 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
2cf70 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2cf80 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2cf90 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2cfc0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2cfd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2cfe0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
2cff0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2d000 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2d010 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2d020 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
2d030 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2d040 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
2d050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
2d060 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
2d070 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d090 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
2d0a0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
2d0b0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
2d0c0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
2d0d0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
2d0e0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
2d0f0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2d100 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
2d110 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
2d120 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2d130 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
2d140 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
2d150 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d170 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
2d180 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
2d190 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
2d1a0 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
2d1b0 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
2d1c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2d1d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2d1e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d1f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2d200 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2d210 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2d220 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2d230 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2d240 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2d250 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
2d260 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
2d270 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
2d280 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
2d290 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
2d2a0 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
2d2b0 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
2d2c0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2d2d0 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
2d2e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d2f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2d300 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d310 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2d320 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  !=0.   && pCur->
2d330 63 75 72 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  curIntKey .  ){.
2d340 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2d350 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2d360 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2d370 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2d380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d390 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
2d3a0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2d3b0 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
2d3c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2d3d0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2d3e0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2d3f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d400 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
2d410 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2d420 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2d430 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2d440 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2d450 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2d460 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2d470 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2d480 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2d490 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2d4a0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2d4b0 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2d4c0 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2d4d0 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2d4e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2d4f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2d500 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2d510 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2d520 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2d530 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2d540 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2d550 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2d560 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2d570 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2d580 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d590 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2d5a0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2d5b0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2d5c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d5d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2d5e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2d5f0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2d600 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2d610 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2d620 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2d630 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2d640 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2d650 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2d660 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2d670 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2d680 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2d690 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2d6a0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2d6b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d6c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2d6d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2d6e0 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2d6f0 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2d700 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2d710 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2d720 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2d730 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2d740 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2d750 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2d760 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2d770 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d780 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2d790 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2d7c0 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2d7d0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2d7e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2d7f0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2d800 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2d810 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2d820 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2d830 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2d840 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2d850 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2d860 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2d870 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2d880 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2d890 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2d8a0 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2d8b0 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2d8c0 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2d8d0 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2d8e0 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2d8f0 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2d900 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2d910 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2d920 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2d930 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2d940 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2d950 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2d960 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2d970 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2d980 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2d990 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d9a0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2d9b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d9c0 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2d9d0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2d9e0 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2d9f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2da00 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2da10 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2da20 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2da30 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2da40 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2da50 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2da60 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2da70 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
2da80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2da90 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2daa0 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2dab0 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2dac0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2dad0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2dae0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2daf0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2db00 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2db10 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2db20 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2db30 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2db40 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2db50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2db60 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2db70 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
2db80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2db90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2dba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2dbb0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2dbc0 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2dbd0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2dbe0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2dbf0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2dc00 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2dc10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2dc20 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2dc30 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2dc40 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2dc50 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2dc60 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2dc70 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2dc80 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2dc90 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2dca0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dcb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2dcc0 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2dcd0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2dce0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2dcf0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2dd00 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2dd10 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2dd20 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2dd30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2dd40 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2dd50 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2dd60 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2dd70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dd80 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2dd90 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2dda0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2ddb0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2ddd0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2dde0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ddf0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
2de00 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2de10 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2de20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de30 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2de40 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2de50 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2de60 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2de70 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2de80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2de90 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2dea0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2deb0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2dec0 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2ded0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2dee0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2def0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2df00 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2df10 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2df20 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2df30 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2df40 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2df50 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2df60 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2df70 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2df80 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2df90 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2dfa0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2dfb0 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2dfc0 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2dfd0 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2dfe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2dff0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2e000 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2e010 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2e020 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2e030 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2e040 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2e050 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2e060 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2e070 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2e080 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2e090 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2e0a0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2e0b0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2e0c0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2e0d0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2e0e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e0f0 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2e100 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2e110 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2e120 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2e130 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2e140 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2e150 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2e160 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2e170 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2e180 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2e190 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2e1a0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2e1b0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2e1c0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2e1d0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2e1e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e1f0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2e200 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2e210 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2e220 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2e230 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2e240 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2e250 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2e260 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2e270 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2e280 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2e290 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2e2a0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2e2b0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2e2c0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2e2d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2e2e0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2e2f0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2e300 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2e310 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2e320 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2e330 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2e340 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2e350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2e360 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2e370 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2e380 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2e390 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2e3a0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2e3b0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2e3c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e3e0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2e3f0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2e400 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2e410 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2e420 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2e430 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2e440 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2e450 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2e460 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2e470 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2e480 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2e490 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2e4a0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2e4b0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2e4c0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2e4d0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2e4e0 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2e4f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2e500 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2e510 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2e520 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2e530 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2e540 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2e550 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2e560 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2e570 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2e580 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2e590 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2e5a0 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2e5b0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2e5c0 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2e5d0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2e5e0 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2e5f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2e600 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2e610 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2e620 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2e630 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2e640 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2e650 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2e660 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2e670 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2e680 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2e690 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2e6a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2e6b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2e6c0 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2e6d0 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2e6e0 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2e6f0 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2e700 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2e710 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2e720 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2e730 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2e740 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e750 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2e760 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2e770 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2e780 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2e790 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2e7a0 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2e7b0 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2e7c0 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2e7d0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2e7e0 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2e7f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2e800 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e810 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2e820 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2e830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e840 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2e850 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2e860 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2e870 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2e880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e8a0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
2e8b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2e8c0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2e8d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2e8e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e8f0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2e900 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2e910 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2e920 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2e930 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2e940 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20  lKey, 2);.      
2e950 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e960 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e970 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2e980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2e990 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2e9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e9b0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2e9c0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2e9d0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
2e9e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2e9f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2ea00 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2ea10 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2ea20 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
2ea30 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2ea40 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
2ea50 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
2ea60 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
2ea70 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2ea80 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
2ea90 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
2eaa0 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
2eab0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2eac0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
2ead0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2eae0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2eaf0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
2eb00 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2eb10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2eb20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2eb30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2eb40 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2eb50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2eb60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2eb70 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2eb80 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2eb90 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2eba0 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
2ebb0 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
2ebc0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
2ebd0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2ebe0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2ebf0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
2ec00 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
2ec10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ec20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2ec30 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2ec40 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2ec50 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
2ec60 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2ec70 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
2ec80 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
2ec90 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2eca0 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
2ecb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2ecc0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
2ecd0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2ece0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ecf0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ed00 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
2ed10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2ed20 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
2ed30 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2ed40 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2ed50 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
2ed60 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
2ed70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ed80 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2ed90 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
2eda0 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2edb0 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
2edc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2edd0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2ede0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2edf0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2ee00 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
2ee10 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
2ee20 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
2ee30 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
2ee40 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
2ee50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2ee60 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
2ee70 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
2ee80 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
2ee90 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
2eea0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
2eeb0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
2eec0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2eed0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2eee0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2eef0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2ef00 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
2ef10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2ef20 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2ef30 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2ef40 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2ef50 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2ef60 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2ef70 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2ef80 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2ef90 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2efa0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2efb0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2efc0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2efd0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2efe0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2eff0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2f000 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2f010 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2f020 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2f030 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2f040 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2f050 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2f060 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2f070 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2f080 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f090 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2f0a0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2f0b0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2f0c0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2f0d0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2f0e0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2f0f0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2f100 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2f110 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2f120 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2f130 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2f140 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2f150 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2f160 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2f170 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2f180 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
2f190 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
2f1a0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
2f1b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
2f1c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
2f1d0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
2f1e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2f1f0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
2f200 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
2f210 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
2f220 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
2f230 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2f240 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2f250 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2f260 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2f270 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2f280 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2f290 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2f2a0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2f2b0 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2f2c0 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2f2d0 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2f2e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2f2f0 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2f300 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2f310 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2f320 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2f330 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2f340 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2f350 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2f360 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2f370 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2f380 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2f390 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2f3a0 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2f3b0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2f3c0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2f3d0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2f3e0 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2f3f0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2f400 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2f410 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2f420 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2f430 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2f440 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2f450 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2f460 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2f470 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2f480 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2f490 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2f4a0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2f4b0 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2f4c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2f4d0 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2f4e0 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2f4f0 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2f500 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2f510 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2f520 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2f530 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2f540 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2f550 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2f560 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2f570 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2f580 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2f590 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2f5a0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2f5b0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2f5c0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2f5d0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2f5e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2f5f0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2f600 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2f610 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2f620 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2f630 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2f640 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2f650 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f660 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2f670 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2f680 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2f690 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2f6a0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2f6b0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2f6c0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2f6d0 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2f6e0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2f6f0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2f700 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2f720 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2f730 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2f740 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2f750 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2f760 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2f770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f780 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2f790 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2f7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2f7b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2f7c0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2f7d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2f7e0 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2f7f0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f800 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2f810 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2f820 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2f830 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2f840 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2f850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f860 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2f870 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2f880 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2f890 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2f8a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2f8b0 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2f8c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2f8d0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2f8e0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2f8f0 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2f900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f910 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2f920 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2f930 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2f940 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2f950 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2f960 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2f970 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2f980 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2f990 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2f9a0 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2f9b0 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2f9c0 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2f9d0 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2f9e0 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2f9f0 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2fa00 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2fa10 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2fa20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2fa30 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2fa40 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2fa50 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2fa60 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2fa70 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2fa80 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2fa90 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2faa0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2fab0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2fac0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2fad0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2fae0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2faf0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2fb00 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2fb10 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2fb20 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2fb30 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2fb40 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2fb50 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2fb60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2fb70 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2fb80 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2fb90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fba0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2fbb0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2fbc0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2fbd0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2fbe0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2fbf0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2fc00 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2fc10 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2fc20 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2fc30 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2fc40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2fc50 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2fc60 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2fc70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2fc80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2fc90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2fca0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2fcb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fcc0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2fcd0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2fce0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2fcf0 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2fd00 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2fd10 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2fd20 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2fd30 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2fd40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2fd50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2fd60 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2fd70 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2fd80 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
2fd90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2fda0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2fdb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2fdc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2fdd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2fde0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2fdf0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2fe00 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2fe10 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a  _ValidOvfl);.  *
2fe20 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
2fe30 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2fe40 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
2fe50 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2fe60 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61  ur, pRes);.  pPa
2fe70 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2fe80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2fe90 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61    if( (++pCur->a
2fea0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2feb0 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])>=pPage->nCell
2fec0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
2fed0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2fee0 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  --;.    return b
2fef0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2ff00 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Res);.  }.  if( 
2ff10 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ff20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ff30 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2ff40 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2ff50 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2ff60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70   }.}../*.** Step
2ff70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2ff80 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
2ff90 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
2ffa0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2ffb0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2ffc0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2ffd0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2ffe0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2fff0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
30000 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
30010 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
30020 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
30030 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
30040 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
30050 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
30060 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
30070 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
30080 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
30090 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
300a0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
300b0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
300c0 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
300d0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
300e0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
300f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
30100 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
30110 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
30120 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
30130 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
30140 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
30150 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
30160 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
30170 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
30180 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
30190 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
301a0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
301b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
301c0 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
301d0 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
301e0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
301f0 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
30200 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
30210 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
30220 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
30230 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
30240 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
30250 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
30260 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
30270 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
30280 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
30290 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
302a0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
302b0 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
302c0 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
302d0 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
302e0 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
302f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
30300 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
30310 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
30320 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
30330 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
30340 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
30350 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
30360 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
30370 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
30380 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
30390 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
303a0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
303b0 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
303c0 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
303d0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
303e0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
303f0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
30400 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
30410 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
30420 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
30430 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
30440 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
30450 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
30460 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
30470 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
30480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
30490 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
304a0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
304b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
304c0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
304d0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
304e0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
304f0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
30500 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
30510 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
30520 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
30530 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
30540 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
30550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
30560 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
30570 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
30580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30590 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
305a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
305b0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
305c0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
305d0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
305e0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
305f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
30600 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
30610 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
30620 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
30630 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
30640 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
30650 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
30660 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
30670 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
30680 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
30690 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
306a0 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
306b0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
306c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
306d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
306e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
306f0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
30700 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
30710 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
30720 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
30730 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30740 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
30750 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
30760 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
30770 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
30780 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
30790 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
307a0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
307b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
307c0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
307d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
307e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
307f0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
30800 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
30810 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
30820 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
30830 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
30840 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
30850 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
30860 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
30870 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
30880 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
30890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
308a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
308b0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
308c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
308d0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
308e0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
308f0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
30900 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
30910 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
30920 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
30930 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
30940 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
30950 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
30960 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
30970 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
30980 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
30990 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
309a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
309b0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
309c0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
309d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
309e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
309f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
30a00 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
30a10 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
30a20 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
30a30 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
30a40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
30a50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
30a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
30a70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
30a80 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
30a90 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
30aa0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
30ab0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
30ac0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30ad0 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  ID );.  *pRes = 
30ae0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
30af0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
30b00 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
30b10 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
30b20 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
30b30 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
30b40 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
30b50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
30b60 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b   || pCur->aiIdx[
30b70 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a  pCur->iPage]==0.
30b80 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61     || pCur->apPa
30b90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
30ba0 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
30bb0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
30bc0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
30bd0 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  s);.  }.  pCur->
30be0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
30bf0 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  e]--;.  return S
30c00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
30c10 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
30c20 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
30c30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
30c40 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
30c50 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
30c60 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
30c70 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
30c80 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
30c90 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
30ca0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
30cb0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
30cc0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
30cd0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
30ce0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
30cf0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
30d00 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
30d10 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
30d20 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
30d30 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
30d40 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
30d50 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
30d60 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
30d70 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
30d80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
30d90 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
30da0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73  ror.  *ppPage is
30db0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
30dc0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
30dd0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
30de0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
30df0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
30e00 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
30e10 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
30e20 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
30e30 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
30e40 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
30e50 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
30e60 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
30e70 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
30e80 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
30e90 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
30ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30eb0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
30ec0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
30ed0 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
30ee0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
30ef0 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
30f00 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
30f10 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
30f20 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
30f30 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
30f40 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
30f50 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
30f60 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
30f70 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
30f80 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
30f90 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
30fa0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
30fb0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
30fc0 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
30fd0 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
30fe0 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
30ff0 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
31000 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
31010 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
31020 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
31030 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
31040 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
31050 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
31060 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
31070 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
31080 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
31090 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
310a0 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
310b0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
310c0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
310d0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
310e0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
310f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
31100 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
31110 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
31120 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
31130 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
31140 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
31150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31160 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
31170 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
31180 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
31190 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
311a0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
311b0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
311c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
311d0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
311e0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
311f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
31200 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
31210 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
31220 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
31230 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
31240 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
31250 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
31260 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
31270 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
31280 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
31290 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
312a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
312b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
312c0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
312d0 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
312e0 62 79 3e 30 20 26 26 20 52 45 51 55 49 52 45 5f  by>0 && REQUIRE_
312f0 50 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70 50  PTRMAP ) );.  pP
31300 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
31310 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
31320 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
31330 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
31340 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
31350 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
31360 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
31370 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
31380 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
31390 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
313a0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
313b0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
313c0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
313d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
313e0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
313f0 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
31400 20 69 66 28 20 49 53 43 4f 4e 43 55 52 52 45 4e   if( ISCONCURREN
31410 54 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78 50 61 67  T==0 && n>=mxPag
31420 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
31430 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31440 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  KPT;.  }..  /* E
31450 6e 73 75 72 65 20 70 61 67 65 20 31 20 69 73 20  nsure page 1 is 
31460 77 72 69 74 61 62 6c 65 2e 20 54 68 69 73 20 66  writable. This f
31470 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69 74  unction will eit
31480 68 65 72 20 63 68 61 6e 67 65 20 74 68 65 20 6e  her change the n
31490 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61  umber.  ** of pa
314a0 67 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 2d  ges in the free-
314b0 6c 69 73 74 20 6f 72 20 74 68 65 20 73 69 7a 65  list or the size
314c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
314d0 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f 74   file. Since bot
314e0 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20  h.  ** of these 
314f0 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c  operations invol
31500 76 65 20 6d 6f 64 69 66 79 69 6e 67 20 70 61 67  ve modifying pag
31510 65 20 31 20 68 65 61 64 65 72 20 66 69 65 6c 64  e 1 header field
31520 73 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a 20 77  s, page 1.  ** w
31530 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79 20 62  ill definitely b
31540 65 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 69  e written by thi
31550 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  s transaction. I
31560 66 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e  f this is an CON
31570 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74 72 61  CURRENT.  ** tra
31580 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75 72 65  nsaction, ensure
31590 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70   the BtreePtrmap
315a0 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62   structure has b
315b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  een allocated.  
315c0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
315d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
315e0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
315f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31600 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29  rc;..  if( n>0 )
31610 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
31620 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
31630 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
31640 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
31650 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
31660 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
31670 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
31680 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
31690 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
316a0 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
316b0 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65  ' */.    u32 nSe
316c0 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43  arch = 0;   /* C
316d0 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
316e0 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74  er of search att
316f0 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20  empts */.    .  
31700 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
31710 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
31720 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
31730 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
31740 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
31750 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
31760 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
31770 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
31780 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
31790 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
317a0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
317b0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
317c0 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  /.    if( eMode=
317d0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
317e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
317f0 49 53 41 55 54 4f 56 41 43 55 55 4d 21 3d 49 53  ISAUTOVACUUM!=IS
31800 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a 20 20  CONCURRENT );.  
31810 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
31820 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
31830 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
31840 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
31850 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
31860 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
31870 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
31880 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
31890 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
318a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
318b0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
318c0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
318d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
318e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
318f0 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
31900 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
31910 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
31920 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
31930 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
31950 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72  se{.        sear
31960 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
31970 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
31980 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
31990 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
319a0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
319b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
319c0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
319d0 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
319e0 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
319f0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
31a00 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
31a10 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
31a20 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
31a30 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
31a40 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
31a50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
31a60 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
31a70 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
31a80 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
31a90 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
31aa0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
31ab0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
31ac0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
31ad0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
31ae0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
31af0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
31b00 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
31b10 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
31b20 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
31b30 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
31b40 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
31b50 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
31b60 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
31b70 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
31b80 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
31b90 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
31ba0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
31bb0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
31bc0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
31bd0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
31be0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
31bf0 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
31c00 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
31c10 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
31c20 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
31c30 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
31c40 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
31c50 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
31c60 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
31c70 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
31c80 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
31c90 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
31ca0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
31cb0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
31cc0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
31cd0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
31ce0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
31cf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
31d00 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
31d10 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
31d20 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
31d30 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
31d40 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
31d50 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
31d60 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
31d70 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
31d80 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
31d90 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
31da0 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
31db0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
31dc0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
31dd0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31de0 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
31df0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
31e00 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
31e10 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
31e20 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72  >mxPage || nSear
31e30 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20  ch++ > n ){.    
31e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31e50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31e70 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31e80 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31e90 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
31ea0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
31eb0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31ec0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
31ed0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
31ee0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
31ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
31f00 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
31f10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31f20 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
31f30 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 );.      /* E
31f40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33  VIDENCE-OF: R-13
31f50 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65  523-04394 The se
31f60 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20  cond integer on 
31f70 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
31f80 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
31f90 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31fa0 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65  leaf page pointe
31fb0 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f  rs to follow. */
31fc0 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
31fd0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
31fe0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
31ff0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
32000 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
32010 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
32020 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
32030 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
32040 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
32050 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
32060 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
32070 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
32080 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
32090 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
320a0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
320b0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
320c0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
320d0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
320e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
320f0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
32100 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
32110 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
32120 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32130 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32140 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
32150 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
32160 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
32170 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
32180 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
32190 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
321a0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
321b0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
321c0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
321d0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
321e0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
321f0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
32200 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
32210 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
32220 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
32230 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
32240 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
32250 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
32260 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
32270 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
32280 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32290 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
322a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
322b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
322c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
322d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
322e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
322f0 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20   searchList .   
32300 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61           && (nea
32310 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28  rby==iTrunk || (
32320 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26  iTrunk<nearby &&
32330 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
32340 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  LE)) .      ){. 
32350 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
32360 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
32370 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
32380 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
32390 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
323a0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
323b0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
323c0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
323d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
323e0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
323f0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70  runk;.        *p
32400 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
32410 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
32420 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32430 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32440 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
32450 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32460 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32470 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32480 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
324a0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
324b0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
324c0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
324d0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
324e0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
324f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
32500 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
32510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32530 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
32540 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32550 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
32580 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
32590 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
325a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
325b0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
325c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
325d0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
325e0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
325f0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
32600 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
32610 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
32620 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
32630 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
32640 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
32650 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
32660 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
32670 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
32680 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
32690 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
326a0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
326b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
326c0 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
326d0 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
326e0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
326f0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
32700 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
32710 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
32720 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
32730 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
32740 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32750 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
32760 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32770 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32790 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
327a0 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
327b0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
327c0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
327d0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e  usedPage(pBt, iN
327e0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
327f0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
32800 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32820 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32830 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32860 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
32870 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32880 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
328a0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
328b0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
328c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
328d0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
328e0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
328f0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
32900 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
32910 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
32920 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32930 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
32940 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
32950 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
32960 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32970 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32980 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
32990 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
329a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
329b0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
329c0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
329d0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
329e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
329f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
32a00 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
32a10 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
32a20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
32a30 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32a40 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
32a50 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
32a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32a80 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
32a90 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
32ab0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
32ac0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32ad0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32ae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32af0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32b00 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
32b10 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
32b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
32b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32b40 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32b50 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
32b60 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
32b70 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
32b80 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
32b90 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
32ba0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
32bb0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
32bc0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
32bd0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
32be0 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
32bf0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
32c00 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
32c10 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
32c20 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
32c30 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
32c40 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
32c50 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
32c60 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
32c70 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
32c80 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
32c90 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
32ca0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
32cb0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
32cc0 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
32cd0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
32ce0 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
32cf0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
32d00 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
32d20 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
32d30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
32d40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32d50 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
32d60 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
32d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
32d80 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
32d90 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
32da0 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
32db0 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
32dc0 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
32dd0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
32de0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
32df0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
32e00 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
32e10 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
32e20 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
32e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
32e40 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
32e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e60 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
32e70 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
32e80 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
32e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32eb0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
32ec0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
32ed0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32ee0 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
32ef0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
32f00 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
32f10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
32f20 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
32f30 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
32f40 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
32f50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32f60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
32f70 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
32f80 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
32f90 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
32fa0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
32fb0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
32fc0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
32fd0 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
32fe0 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
32ff0 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
33000 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
33010 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
33020 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
33030 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
33040 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
33050 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
33060 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
33070 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
33080 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
33090 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
330b0 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
330c0 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
330d0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
330e0 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
330f0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
33100 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
33110 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33120 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
33130 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
33140 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
33150 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
33160 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33170 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
33180 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
33190 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
331a0 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
331b0 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
331c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
331d0 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
331e0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
331f0 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
33200 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
33210 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
33220 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
33230 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20  NTENT : 0;.     
33240 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
33250 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
33260 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
33270 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
33280 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
33290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
332a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
332b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
332c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
332d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
332e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
332f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33300 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33310 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
33320 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
33330 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
33340 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
33350 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
33360 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
33370 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
33380 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
33390 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
333a0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
333b0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
333c0 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
333d0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
333e0 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
333f0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
33400 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
33410 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
33420 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
33430 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
33440 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
33450 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
33460 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
33470 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
33480 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
33490 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
334a0 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
334b0 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
334c0 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
334d0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
334e0 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
334f0 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
33500 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
33510 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
33520 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
33530 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
33540 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
33550 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
33560 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
33570 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
33580 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
33590 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
335a0 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
335b0 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
335c0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
335d0 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
335e0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
335f0 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
33600 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
33610 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
33620 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
33630 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
33640 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
33650 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
33660 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
33670 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
33680 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
33690 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
336a0 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
336b0 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
336c0 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
336d0 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
336e0 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
336f0 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
33700 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
33710 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
33720 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
33730 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
33740 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
33750 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
33760 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
33770 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
33780 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
33790 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
337a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
337b0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
337c0 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
337d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
337e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
337f0 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
33800 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
33810 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
33820 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
33830 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
33840 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33850 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
33860 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33870 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33880 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
33890 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
338a0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
338b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
338c0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
338d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
338e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
338f0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33900 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
33910 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
33920 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
33930 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
33940 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
33950 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
33960 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
33970 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
33980 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
33990 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
339a0 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
339b0 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
339c0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
339d0 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
339e0 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
339f0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
33a00 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
33a10 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
33a20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
33a30 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
33a40 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
33a50 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
33a60 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
33a70 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
33a80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
33a90 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
33aa0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
33ab0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33ac0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
33ad0 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
33ae0 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
33af0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33b10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33b20 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
33b30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
33b40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
33b50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33b60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33b70 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
33b80 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
33b90 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
33ba0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33bb0 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
33bc0 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
33bd0 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
33be0 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
33bf0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
33c00 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
33c10 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
33c20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
33c30 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
33c40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33c50 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
33c60 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
33c70 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
33c80 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
33c90 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
33ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33cc0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
33cd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33ce0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33cf0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
33d00 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
33d10 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
33d20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52   0;.    }.    TR
33d30 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
33d40 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
33d50 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
33d60 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
33d70 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
33d80 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
33d90 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
33da0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
33db0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
33dc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
33dd0 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72  vTrunk);.  asser
33de0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33df0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33e00 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
33e10 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
33e20 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=1 );.  assert(
33e30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
33e40 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  | (*ppPage)->isI
33e50 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  nit==0 );.  retu
33e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
33e70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
33e80 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
33e90 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
33ea0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
33eb0 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
33ec0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
33ed0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
33ee0 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
33ef0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
33f00 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
33f10 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
33f20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
33f30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
33f40 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
33f50 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
33f60 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
33f70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
33f80 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
33f90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
33fa0 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
33fb0 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
33fc0 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
33fd0 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
33fe0 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
33ff0 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
34000 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
34010 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
34020 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
34030 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
34040 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
34050 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
34060 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
34070 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
34080 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
34090 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
340a0 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
340b0 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
340c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
340d0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
340e0 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
340f0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
34100 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
34110 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
34120 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34130 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
34140 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
34150 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
34160 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
34170 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
34180 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
34190 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
341a0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
341b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
341c0 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
341d0 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
341e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
341f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
34210 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
34220 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34240 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
34250 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
34260 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
34270 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
34280 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
34290 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
342a0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
342b0 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  | iPage>1 );.  a
342c0 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
342d0 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
342e0 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
342f0 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65  if( iPage<2 ) re
34300 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34310 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20  UPT_BKPT;.  if( 
34320 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
34330 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
34340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
34350 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
34360 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
34370 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
34380 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
34390 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
343a0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
343b0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
343c0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
343d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
343e0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
343f0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
34400 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
34410 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
34420 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
34430 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
34440 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34450 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
34460 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
34470 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
34480 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
34490 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
344a0 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
344b0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
344c0 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
344d0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
344e0 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
344f0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
34500 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
34510 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
34520 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
34530 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
34540 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
34550 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
34560 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
34570 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34580 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
34590 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
345a0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
345b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
345c0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
345d0 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
345e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
345f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
34600 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
34610 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
34620 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
34630 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
34640 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
34650 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
34660 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
34670 20 52 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20   REQUIRE_PTRMAP 
34680 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
34690 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
346a0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
346b0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
346c0 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
346d0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
346e0 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
346f0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
34700 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
34710 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
34720 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
34730 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
34740 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
34750 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
34760 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
34770 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
34780 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
34790 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
347a0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
347b0 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
347c0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
347d0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
347e0 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
347f0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
34800 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
34810 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
34820 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
34830 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
34840 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
34850 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
34860 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
34870 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
34880 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
34890 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
348a0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
348b0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
348c0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
348d0 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
348e0 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
348f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
34900 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
34910 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
34920 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
34930 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
34940 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
34950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34960 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34970 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
34980 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
34990 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
349a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
349b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
349c0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
349d0 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
349e0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
349f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34a00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34a10 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
34a20 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
34a30 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
34a40 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
34a50 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
34a60 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
34a70 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
34a80 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
34a90 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
34aa0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
34ab0 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
34ac0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
34ad0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
34ae0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
34af0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
34b00 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
34b10 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
34b20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
34b30 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
34b40 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
34b50 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
34b60 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
34b70 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
34b80 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
34b90 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
34ba0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
34bb0 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
34bc0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
34bd0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34be0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
34bf0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
34c00 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
34c10 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
34c20 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
34c30 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
34c40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
34c50 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
34c60 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
34c70 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
34c80 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
34c90 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
34ca0 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
34cb0 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
34cc0 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
34cd0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
34ce0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
34cf0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
34d00 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
34d10 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
34d20 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
34d30 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
34d40 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
34d50 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
34d60 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
34d70 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
34d80 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
34d90 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
34da0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
34db0 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  "..      **.    
34dc0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
34dd0 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20  : R-19920-11576 
34de0 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76  However, newer v
34df0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
34e00 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  e still.      **
34e10 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65   avoid using the
34e20 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65   last six entrie
34e30 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s in the freelis
34e40 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72  t trunk page arr
34e50 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ay in.      ** o
34e60 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61  rder that databa
34e70 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
34e80 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
34e90 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e  ns of SQLite can
34ea0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   be.      ** rea
34eb0 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
34ec0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20  ons of SQLite.. 
34ed0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
34ee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34ef0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
34f00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
34f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34f20 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
34f30 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
34f40 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
34f50 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
34f60 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
34f70 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
34f80 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
34f90 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
34fa0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
34fb0 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
34fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
34fd0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
34fe0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
34ff0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
35000 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
35010 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
35020 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
35030 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
35040 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
35050 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
35060 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
35070 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
35080 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
35090 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
350a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
350b0 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
350c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
350d0 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
350e0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
350f0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
35100 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
35110 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
35120 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
35130 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
35140 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
35150 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
35160 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
35170 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
35180 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
35190 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
351a0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
351b0 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
351c0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
351d0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
351e0 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
351f0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
35200 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
35210 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
35220 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
35230 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
35240 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
35250 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
35260 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
35270 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
35280 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35290 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
352a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
352b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
352c0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
352d0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
352e0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
352f0 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
35300 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
35310 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
35320 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35330 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
35340 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
35350 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
35360 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
35370 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
35380 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
35390 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
353a0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
353b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
353c0 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
353d0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
353e0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
353f0 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
35400 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
35410 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
35420 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
35430 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
35440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35450 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
35460 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
35470 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
35480 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
35490 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
354a0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
354b0 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
354c0 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20  en Cell.  Write 
354d0 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c  the.** local Cel
354e0 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62  l size (the numb
354f0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74  er of bytes on t
35500 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
35510 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76  , omitting.** ov
35520 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e  erflow) into *pn
35530 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
35540 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
35550 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
35560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
35570 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
35580 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
35590 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
355a0 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
355b0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
355c0 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70  Cell */.  u16 *p
355d0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
355e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
355f0 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  size of the Cell
35600 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74   here */.){.  Bt
35610 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
35620 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
35630 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
35640 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
35650 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
35660 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
35670 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
35680 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
35690 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
356a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
356b0 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
356c0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
356d0 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  fo);.  *pnSize =
356e0 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69   info.nSize;.  i
356f0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
35700 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
35710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
35720 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
35730 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
35740 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
35750 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
35760 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
35770 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e  flow+3 > pPage->
35780 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
35790 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  kPage ){.    ret
357a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
357b0 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c  PT_BKPT;  /* Cel
357c0 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
357d0 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
357e0 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
357f0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
35800 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
35810 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
35820 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
35830 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
35840 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
35850 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
35860 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
35870 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
35880 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
35890 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
358a0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c  .  assert( nOvfl
358b0 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52  >0 || .    (CORR
358c0 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e  UPT_DB && (info.
358d0 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50  nPayload + ovflP
358e0 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67  ageSize)<ovflPag
358f0 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68  eSize).  );.  wh
35900 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
35910 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
35920 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
35930 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
35940 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
35950 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
35960 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
35970 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
35980 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
35990 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
359a0 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
359b0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
359c0 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
359d0 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
359e0 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
359f0 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
35a00 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
35a10 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
35a20 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
35a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
35a40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
35a50 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
35a60 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
35a70 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
35a80 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
35a90 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
35aa0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
35ab0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
35ac0 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
35ad0 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
35ae0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
35af0 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
35b00 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
35b10 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
35b20 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
35b30 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
35b40 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
35b50 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
35b60 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
35b70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
35b80 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
35b90 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
35ba0 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
35bb0 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
35bc0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
35bd0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
35be0 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
35bf0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
35c00 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
35c10 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
35c20 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
35c30 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
35c40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
35c50 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
35c60 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
35c70 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
35c80 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
35c90 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
35ca0 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
35cb0 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
35cc0 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
35cd0 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
35ce0 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
35cf0 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
35d00 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
35d10 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
35d20 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
35d30 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
35d40 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
35d50 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
35d60 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
35d70 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
35d80 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
35d90 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
35da0 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
35db0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
35dc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35dd0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
35de0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
35df0 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
35e00 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
35e10 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
35e20 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
35e30 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
35e40 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
35e50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
35e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
35e70 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
35e80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
35e90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
35ea0 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
35eb0 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
35ec0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
35ed0 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
35ee0 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
35ef0 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
35f00 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
35f10 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
35f20 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
35f30 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
35f40 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
35f50 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
35f60 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
35f70 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
35f80 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
35f90 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
35fa0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
35fb0 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
35fc0 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
35fd0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
35fe0 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
35ff0 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
36000 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
36010 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
36020 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
36030 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
36040 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
36050 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
36060 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
36070 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
36080 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
36090 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
360a0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
360b0 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
360c0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
360d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
360e0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
360f0 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
36100 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
36110 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
36120 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
36130 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
36140 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
36150 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
36160 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
36170 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
36180 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
36190 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
361a0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
361b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
361c0 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
361d0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
361e0 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
361f0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
36200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
36210 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
36220 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
36230 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
36240 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
36250 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
36260 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
36270 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
36280 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
36290 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
362a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
362b0 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
362c0 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
362d0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
362e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
362f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
36300 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
36310 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
36320 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
36330 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
36340 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
36350 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
36360 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
36370 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
36380 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
36390 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
363a0 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
363b0 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
363c0 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
363d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
363e0 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
363f0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
36400 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
36410 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
36420 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
36430 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36440 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36450 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
36460 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
36470 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
36480 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
36490 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
364a0 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
364b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
364c0 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
364d0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
364e0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
364f0 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65   nPayload);.  }e
36500 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
36510 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20   nData==0 );.   
36520 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d   assert( nZero==
36530 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  0 );.  }.  nHead
36540 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
36550 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
36560 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
36570 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
36580 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  the payload size
36590 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
365a0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
365b0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
365c0 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
365d0 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
365e0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
365f0 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66  rt( nKey<=0x7fff
36600 66 66 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20  ffff && pKey!=0 
36610 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  );.    nPayload 
36620 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
36630 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
36640 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
36650 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
36660 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
36670 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
36680 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
36690 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
366a0 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
366b0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
366c0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
366d0 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
366e0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61  ize = n;.    spa
366f0 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61  ceLeft = nPayloa
36700 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  d;.    pPrior = 
36710 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCell;.  }else{.
36720 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61      int mn = pPa
36730 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
36740 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
36750 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
36760 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
36770 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
36780 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
36790 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
367a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
367b0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
367c0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e  1 );.    if( n >
367d0 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
367e0 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73   ) n = mn;.    s
367f0 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
36800 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
36810 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20  nHeader + 4;.   
36820 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
36830 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d  [nHeader+n];.  }
36840 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
36850 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a  Cell[nHeader];..
36860 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
36870 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
36880 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
36890 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
368a0 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
368b0 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
368c0 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
368d0 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
368e0 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
368f0 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
36900 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
36910 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
36920 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
36930 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
36940 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
36950 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
36960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36970 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
36980 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
36990 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
369a0 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
369b0 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
369c0 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
369d0 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
369e0 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
369f0 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
36a00 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
36a10 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
36a20 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
36a30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
36a40 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
36a50 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
36a60 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
36a70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
36a80 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
36a90 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
36aa0 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
36ab0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
36ac0 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
36ad0 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  info;.    pPage-
36ae0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
36af0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
36b00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
36b10 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f  eader=(int)(info
36b20 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
36b30 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
36b40 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
36b50 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
36b60 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
36b70 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
36b80 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
36b90 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
36ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
36bb0 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69  rior == &pCell[i
36bc0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29  nfo.iOverflow] )
36bd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
36be0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
36bf0 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
36c00 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
36c10 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
36c20 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
36c30 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
36c40 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
36c50 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
36c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36c70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
36c80 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
36c90 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
36ca0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
36cb0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
36cc0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
36cd0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
36ce0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
36cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
36d00 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
36d10 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
36d20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
36d30 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
36d40 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
36d50 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
36d60 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
36d70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
36d80 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
36d90 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
36da0 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
36db0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
36dc0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
36dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
36de0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
36df0 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
36e00 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
36e10 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
36e20 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
36e30 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
36e40 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
36e50 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
36e60 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
36e70 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
36e80 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
36e90 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
36ea0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
36eb0 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
36ec0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
36ed0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
36ee0 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
36ef0 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
36f00 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
36f10 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
36f20 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
36f30 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
36f40 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
36f50 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
36f60 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
36f70 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
36f80 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
36f90 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
36fa0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
36fb0 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
36fc0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
36fd0 20 20 20 20 69 66 28 20 52 45 51 55 49 52 45 5f      if( REQUIRE_
36fe0 50 54 52 4d 41 50 20 26 26 20 72 63 3d 3d 53 51  PTRMAP && rc==SQ
36ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37000 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
37010 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
37020 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
37030 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
37040 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
37050 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
37060 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
37070 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
37080 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37090 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
370a0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
370b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
370c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
370d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
370e0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
370f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37100 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
37110 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
37120 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
37130 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
37140 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
37150 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
37160 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
37170 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
37180 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37190 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
371a0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
371b0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
371c0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
371d0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
371e0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
371f0 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
37200 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
37210 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
37220 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
37230 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
37240 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
37250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
37260 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
37270 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
37280 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
37290 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
372a0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
372b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
372c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
372d0 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
372e0 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
372f0 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
37300 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
37310 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
37320 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
37330 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
37340 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
37350 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
37360 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
37370 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
37380 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
37390 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
373a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
373b0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
373c0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
373d0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
373e0 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
373f0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
37400 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
37410 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
37420 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
37430 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
37440 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
37450 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
37460 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
37470 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
37480 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
37490 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
374a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
374b0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
374c0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
374d0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
374e0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
374f0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
37500 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
37510 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
37520 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
37530 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37540 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
37550 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
37560 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
37570 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
37580 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
37590 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
375a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
375b0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
375c0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
375d0 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
375e0 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
375f0 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
37600 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
37610 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
37620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
37630 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
37640 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
37650 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
37660 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
37670 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
37680 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
37690 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
376a0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
376b0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
376c0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
376d0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
376e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
376f0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
37700 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
37710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
37720 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
37730 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
37740 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
37750 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
37760 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
37770 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
37780 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
37790 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
377a0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
377b0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
377c0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
377d0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
377e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
377f0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
37800 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
37810 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
37820 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
37830 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
37840 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
37850 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
37860 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
37870 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
37880 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
37890 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
378a0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
378b0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
378c0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
378d0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
378e0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
378f0 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
37900 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
37910 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
37920 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
37930 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
37940 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
37950 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
37960 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
37970 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
37980 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
37990 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
379a0 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
379b0 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
379c0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
379d0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
379e0 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
379f0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
37a00 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
37a10 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
37a20 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
37a30 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
37a40 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37a50 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37a60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37a70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
37a80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
37a90 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
37aa0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
37ab0 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
37ac0 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
37ad0 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
37ae0 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
37af0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
37b00 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
37b10 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
37b20 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
37b30 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
37b40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
37b50 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
37b60 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
37b70 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
37b80 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
37b90 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
37ba0 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
37bb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
37bc0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
37bd0 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
37be0 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
37bf0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
37c00 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
37c10 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
37c20 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
37c30 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
37c40 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
37c50 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
37c60 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
37c70 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
37c80 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
37c90 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
37ca0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
37cb0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
37cc0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
37cd0 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
37ce0 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
37cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d00 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
37d10 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
37d20 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
37d30 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
37d40 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
37d50 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
37d60 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
37d70 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
37d80 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
37d90 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
37da0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
37db0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
37dc0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
37dd0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
37de0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
37df0 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
37e00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
37e10 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
37e20 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
37e30 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
37e40 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
37e50 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
37e60 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
37e70 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
37e80 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
37e90 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
37ea0 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
37eb0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
37ec0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
37ed0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
37ee0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
37ef0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
37f00 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
37f10 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
37f20 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
37f30 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
37f40 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
37f50 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
37f60 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
37f70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
37f80 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
37f90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
37fa0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
37fb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
37fc0 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
37fd0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
37fe0 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
37ff0 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
38000 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
38010 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
38020 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
38030 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
38040 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
38050 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
38060 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
38070 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
38080 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
38090 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
380a0 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
380b0 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
380c0 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
380d0 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
380e0 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
380f0 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
38100 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
38110 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
38120 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
38130 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
38140 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
38150 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
38160 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
38170 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
38180 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
38190 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
381a0 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
381b0 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
381c0 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
381d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
381e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
381f0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
38200 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
38210 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
38220 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
38230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
38240 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
38250 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
38260 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
38270 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
38280 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
38290 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
382a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
382b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
382c0 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
382d0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
382e0 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
382f0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
38300 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
38310 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  Bt) || CORRUPT_D
38320 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
38330 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
38340 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
38350 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
38360 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
38370 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
38380 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
38390 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
383a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
383b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
383c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
383d0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
383e0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
383f0 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
38400 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
38410 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
38420 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
38430 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
38440 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
38450 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
38460 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
38470 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
38480 20 34 20 62 75 74 20