/ Hex Artifact Content
Login

Artifact 593a90431223ca1dcdd3ff6797e96d36147434431dbfaf213e866e400dd408df:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51  }.}.#else  /* SQ
5440: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
5450: 52 45 4e 54 20 2a 2f 0a 23 20 64 65 66 69 6e 65  RENT */.# define
5460: 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
5470: 63 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f  cate(x) SQLITE_O
5480: 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  K.# define btree
5490: 50 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20  PtrmapDelete(x) 
54a0: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
54b0: 74 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20  trmapBegin(x,y) 
54c0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
54d0: 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45  ine btreePtrmapE
54e0: 6e 64 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  nd(x,y,z) .#endi
54f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5500: 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a  _CONCURRENT */..
5510: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
5520: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
5530: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
5540: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
5550: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
5560: 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d  leasePageOne(Mem
5570: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
5580: 20 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65     /* Forward re
5590: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
55a0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
55b0: 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
55c0: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
55d0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
55e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68   */../*.***** Th
55f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5600: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
5610: 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a  ert() only ****.
5620: 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  **.** Verify tha
5630: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
5640: 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ds the mutex on 
5650: 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  its BtShared.*/.
5660: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5670: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
5680: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5690: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
56a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
56b0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
56c0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20  ->mutex);.}../* 
56d0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
56e0: 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65 20 42  cursor and the B
56f0: 74 53 68 61 72 65 64 20 61 67 72 65 65 20 61 62  tShared agree ab
5700: 6f 75 74 20 77 68 61 74 20 69 73 20 74 68 65 20  out what is the 
5710: 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  current.** datab
5720: 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54  ase connetion. T
5730: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
5740: 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63 68 65   in shared-cache
5750: 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 64 61   mode. If the da
5760: 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65  tabase .** conne
5770: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67  ction pointers g
5780: 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20  et out-of-sync, 
5790: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
57a0: 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65  or routines like
57b0: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
57c0: 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e 63 65  e() to reference
57d0: 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63   an stale connec
57e0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61  tion pointer tha
57f0: 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 0a 2a  t references a.*
5800: 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  * a connection t
5810: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
5820: 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20 72 6f  closed.  This ro
5830: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
5840: 73 69 64 65 20 61 73 73 65 72 74 28 29 0a 2a 2a  side assert().**
5850: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79   statements only
5860: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 75 72   and for the pur
5870: 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63  pose of double-c
5880: 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74 68 65  hecking that the
5890: 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64   btree code.** d
58a0: 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64 61 74  oes keep the dat
58b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
58c0: 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d   pointers up-to-
58d0: 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  date..*/.static 
58e0: 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  int cursorOwnsBt
58f0: 53 68 61 72 65 64 28 42 74 43 75 72 73 6f 72 20  Shared(BtCursor 
5900: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  *p){.  assert( c
5910: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5920: 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  p) );.  return (
5930: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  p->pBtree->db==p
5940: 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65  ->pBt->db);.}.#e
5950: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  ndif../*.** Inva
5960: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
5970: 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74 68 65  low cache of the
5980: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
5990: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
59a0: 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20  ment..** on the 
59b0: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
59c0: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23  ucture pBt..*/.#
59d0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
59e0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
59f0: 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46  Cur) (pCur->curF
5a00: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
5a10: 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20  lidOvfl)../*.** 
5a20: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5a30: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
5a40: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
5a50: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
5a60: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
5a70: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
5a80: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
5a90: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
5aa0: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
5ab0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
5ac0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5ad0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5ae0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5af0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
5b00: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
5b10: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5b20: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
5b30: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a  erflowCache(p);.
5b40: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
5b60: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  LOB./*.** This f
5b70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
5b80: 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  d before modifyi
5b90: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
5ba0: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f  of a table.** to
5bb0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
5bc0: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
5bd0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5be0: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
5bf0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
5c00: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
5c10: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
5c20: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
5c30: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
5c40: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
5c50: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
5c60: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
5c70: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
5c80: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
5c90: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
5ca0: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
5cb0: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
5cc0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
5cd0: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
5ce0: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
5cf0: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
5d00: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
5d10: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
5d20: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
5d30: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
5d40: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
5d50: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
5d60: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
5d70: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
5d80: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
5d90: 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69   on that specifi
5da0: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
5db0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
5dc0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
5dd0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
5de0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
5df0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
5e00: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
5e10: 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e30: 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  le that might be
5e40: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
5e50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
5e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
5e70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
5e80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
5e90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
5ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5eb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
5ec0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
5ed0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
5ee0: 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d  p;.  if( pBtree-
5ef0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d  >hasIncrblobCur=
5f00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
5f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
5f20: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
5f30: 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65  tree) );.  pBtre
5f40: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
5f50: 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  r = 0;.  for(p=p
5f60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
5f70: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5f80: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  xt){.    if( (p-
5f90: 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
5fa0: 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b  _Incrblob)!=0 ){
5fb0: 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68  .      pBtree->h
5fc0: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
5fd0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  1;.      if( p->
5fe0: 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f  pgnoRoot==pgnoRo
5ff0: 6f 74 20 26 26 20 28 69 73 43 6c 65 61 72 54 61  ot && (isClearTa
6000: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
6010: 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20  Key==iRow) ){.  
6020: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
6030: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6050: 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f    }.}..#else.  /
6060: 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20  * Stub function 
6070: 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73  when INCRBLOB is
6080: 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64   omitted */.  #d
6090: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
60a0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
60b0: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
60c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
60d0: 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
60e0: 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f  * Set bit pgno o
60f0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  f the BtShared.p
6100: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
6110: 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  c. This is calle
6120: 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67  d .** when a pag
6130: 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c  e that previousl
6140: 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61  y contained data
6150: 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
6160: 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61  list leaf .** pa
6170: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74  ge..**.** The Bt
6180: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
6190: 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73  nt bitvec exists
61a0: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
61b0: 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75  an obscure.** bu
61c0: 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20  g caused by the 
61d0: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74  interaction of t
61e0: 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74  wo useful IO opt
61f0: 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f  imizations surro
6200: 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c  unding.** free-l
6210: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a  ist leaf pages:.
6220: 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
6230: 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  all data is dele
6240: 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20  ted from a page 
6250: 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63  and the page bec
6260: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66  omes.**      a f
6270: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
6280: 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20  ge, the page is 
6290: 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
62b0: 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73      (as free-lis
62c0: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e  t leaf pages con
62d0: 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66  tain no meaningf
62e0: 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69  ul data). Someti
62f0: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68  mes.**      such
6300: 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65   a page is not e
6310: 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28  ven journalled (
6320: 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
6330: 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20  e modified,.**  
6340: 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a      why bother j
6350: 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e  ournalling it?).
6360: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
6370: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6380: 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64  f page is reused
6390: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73  , its content is
63a0: 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20   not read.**    
63b0: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62    from the datab
63c0: 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74  ase or written t
63d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
63e0: 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69  le (why should i
63f0: 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66  t.**      be, if
6400: 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c   it is not at al
6410: 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a  l meaningful?)..
6420: 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c  **.** By themsel
6430: 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d  ves, these optim
6440: 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69  izations work fi
6450: 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61  ne and provide a
6460: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
6470: 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62  mance boost to b
6480: 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e  ulk delete or in
6490: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  sert operations.
64a0: 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20   However, if.** 
64b0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
64c0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
64d0: 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64   and then reused
64e0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
64f0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  .** transaction,
6500: 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73   a problem comes
6510: 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65   up. If the page
6520: 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c   is not journall
6530: 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73  ed when.** it is
6540: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
6550: 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69  ee-list and it i
6560: 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e  s also not journ
6570: 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a  alled when it.**
6580: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
6590: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
65a0: 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65   and reused, the
65b0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  n the original d
65c0: 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f  ata.** may be lo
65d0: 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74  st. In the event
65e0: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20   of a rollback, 
65f0: 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  it may not be po
6600: 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73  ssible.** to res
6610: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
6620: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
6630: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l configuration.
6640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74  .**.** The solut
6650: 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61  ion is the BtSha
6660: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
6670: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
6680: 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d   a page is .** m
6690: 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  oved to become a
66a0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
66b0: 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73  page, the corres
66c0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a  ponding bit is.*
66d0: 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74  * set in the bit
66e0: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
66f0: 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74  leaf page is ext
6700: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
6710: 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70  free-list,.** op
6720: 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f  timization 2 abo
6730: 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  ve is omitted if
6740: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
6750: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
6760: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
6770: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
6780: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
6790: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
67a0: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
67b0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
67c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
67d0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
67e0: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
67f0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
6800: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
6810: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6820: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
6830: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  ontent ){.    as
6840: 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d  sert( pgno<=pBt-
6850: 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42  >nPage );.    pB
6860: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
6870: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
6880: 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29  eate(pBt->nPage)
6890: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
68a0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
68b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
68c0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
68d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
68e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
68f0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
6900: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
6910: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
6920: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
6930: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
6940: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
6950: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6960: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
6970: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6980: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
6990: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
69a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
69b0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
69c0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
69d0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
69e0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
69f0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
6a00: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
6a10: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
6a20: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
6a30: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
6a40: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
6a50: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
6a60: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
6a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6a80: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
6a90: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6aa0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
6ab0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
6ac0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
6ad0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
6ae0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
6af0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
6b00: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
6b10: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
6b20: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
6b30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
6b40: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
6b50: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
6b60: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
6b70: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
6b80: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
6b90: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
6ba0: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
6bb0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
6bc0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
6bd0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
6be0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
6bf0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
6c00: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
6c10: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6c20: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
6c30: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
6c40: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
6c50: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
6c60: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
6c70: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
6c80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
6c90: 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
6ca0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6cb0: 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
6cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
6cd0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
6ce0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
6cf0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
6d00: 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
6d10: 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
6d20: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
6d30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6d40: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
6d50: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
6d60: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
6d70: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
6d80: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
6d90: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6da0: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
6db0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6dc0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
6dd0: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
6de0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
6df0: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
6e00: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
6e10: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
6e20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6e30: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
6e40: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
6e50: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
6e60: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
6e70: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
6e80: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
6e90: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
6ea0: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
6eb0: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
6ec0: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
6ed0: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
6ee0: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
6ef0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
6f00: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
6f10: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
6f20: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
6f30: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
6f40: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
6f50: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
6f60: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
6f70: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
6f80: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
6f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6fa0: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
6fb0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6fc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6fd0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
6fe0: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
6ff0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
7000: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
7010: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
7020: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
7030: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
7040: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
7050: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
7060: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
7070: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
7080: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
7090: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
70a0: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
70b0: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
70c0: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
70d0: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
70e0: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
70f0: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
7100: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
7110: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
7130: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
7140: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
7150: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
7160: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
7170: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
7180: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7190: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
71a0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
71b0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
71c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
71d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
71e0: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
71f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7200: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7210: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
7220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7230: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7240: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
7260: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
7270: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
7280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7290: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
72a0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
72b0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
72c0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
72d0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
72e0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
72f0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
7300: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
7310: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
7320: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
7330: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
7340: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
7350: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
7360: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
7370: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
7380: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
7390: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
73a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
73b0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
73c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
73d0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
73e0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
73f0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
7400: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
7410: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
7420: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
7430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
7440: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
7450: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
7460: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7470: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
7480: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
7490: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
74a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
74b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
74c0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
74d0: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
74e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
74f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
7500: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
7510: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
7520: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
7530: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
7540: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
7550: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
7560: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
7570: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
7580: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
7590: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
75a0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
75b0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
75c0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
75d0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
75e0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
75f0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
7600: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
7610: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
7620: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
7630: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
7640: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
7650: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
7660: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
7670: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
7680: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
7690: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
76a0: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
76b0: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
76c0: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
76d0: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
76e0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
76f0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
7700: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
7710: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
7720: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
7730: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
7740: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
7750: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
7760: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
7770: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
7780: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
7790: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
77a0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
77b0: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
77c0: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
77d0: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
77e0: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
77f0: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
7800: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
7810: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
7820: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
7830: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
7840: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
7850: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7860: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
7870: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
7880: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
7890: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
78a0: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
78b0: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
78c0: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
78d0: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
78e0: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
78f0: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
7900: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
7910: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
7920: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
7930: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
7940: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
7950: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
7960: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
7970: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
7980: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
7990: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
79a0: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
79b0: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
79c0: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
79d0: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
79e0: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
79f0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
7a00: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
7a10: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
7a20: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
7a30: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
7a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a50: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
7a60: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7a70: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
7a80: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
7a90: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
7aa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7ab0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7ac0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
7ad0: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
7ae0: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
7af0: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
7b00: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
7b10: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
7b20: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7b30: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7b40: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7b50: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
7b60: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
7b70: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
7b80: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
7b90: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
7ba0: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
7bb0: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
7bc0: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
7bd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7be0: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
7bf0: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
7c00: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
7c10: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
7c20: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
7c30: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
7c40: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
7c50: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
7c60: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
7c70: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
7c80: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
7c90: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
7ca0: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
7cb0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
7cc0: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
7cd0: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
7ce0: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
7cf0: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
7d00: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
7d10: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
7d20: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
7d30: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
7d40: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
7d50: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
7d60: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
7d70: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
7d80: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
7d90: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
7da0: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
7db0: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
7dc0: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
7dd0: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
7de0: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
7df0: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
7e00: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
7e10: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7e20: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7e30: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7e40: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
7e50: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
7e60: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
7e70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7e80: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
7e90: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
7ea0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
7eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
7ec0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
7ed0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
7ee0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
7ef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f00: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
7f10: 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Page>=0 );.     
7f20: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
7f30: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
7f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7f50: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
7f60: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b  ;.  }while( p );
7f70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7f80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
7f90: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
7fa0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
7fb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7fc0: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
7fd0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7fe0: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
7ff0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
8000: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
8010: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
8020: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
8030: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
8040: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
8050: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
8060: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
8070: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
8080: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
8090: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
80a0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
80b0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
80c0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
80d0: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
80e0: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
80f0: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
8100: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
8110: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
8120: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
8130: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
8140: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
8150: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
8160: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
8170: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
8180: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
8190: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
81a0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
81b0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
81c0: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
81d0: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
81e0: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
81f0: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
8200: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
8210: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
8220: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
8230: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
8240: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
8250: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
8260: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
8270: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
8280: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
8290: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
82a0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
82b0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
82c0: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
82d0: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20   index key */.. 
82e0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
82f0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
8300: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
8310: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
8320: 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
8330: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43  npackedRecord(pC
8340: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ur->pKeyInfo);. 
8350: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
8360: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
8370: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
8380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
8390: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
83a0: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
83b0: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
83c0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
83d0: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
83e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
83f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8400: 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
8410: 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d  veto_done;.    }
8420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8430: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
8440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8450: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
8460: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
8470: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
8480: 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a  );.moveto_done:.
8490: 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
84a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
84b0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
84c0: 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b  o->db, pIdxKey);
84d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
84e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
84f0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
8500: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
8510: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
8520: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
8530: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
8540: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8550: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
8560: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
8570: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
8580: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
8590: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
85a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
85b0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
85c0: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
85d0: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
85e0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
85f0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
8600: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
8610: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
8620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
8630: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
8640: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
8650: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
8660: 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e   rc;.  int skipN
8670: 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ext;.  assert( c
8680: 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
8690: 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
86a0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
86b0: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
86c0: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
86d0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
86e0: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
86f0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
8700: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
8710: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
8720: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
8730: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
8740: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
8750: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
8760: 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69   &skipNext);.  i
8770: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8780: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8790: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
87a0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
87b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
87c0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
87d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
87e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
87f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
8800: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
8810: 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a  xt |= skipNext;.
8820: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
8830: 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e  ipNext && pCur->
8840: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
8850: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43  ALID ){.      pC
8860: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
8870: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
8880: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8890: 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20   rc;.}..#define 
88a0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
88b0: 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d  ition(p) \.  (p-
88c0: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
88d0: 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a  REQUIRESEEK ? \.
88e0: 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65           btreeRe
88f0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
8900: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
8910: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
8920: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
8930: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
8940: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
8950: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
8960: 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ion where.** it 
8970: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c  was last placed,
8980: 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76   or has been inv
8990: 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79  alidated for any
89a0: 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a   other reason..*
89b0: 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f  * Cursors can mo
89c0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
89d0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
89e0: 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20  g at is deleted 
89f0: 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65  out.** from unde
8a00: 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d  r them, for exam
8a10: 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67  ple.  Cursor mig
8a20: 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20  ht also move if 
8a30: 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65  a btree.** is re
8a40: 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
8a50: 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
8a60: 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c  tine with a NULL
8a70: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20   cursor pointer 
8a80: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a  returns false..*
8a90: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70  *.** Use the sep
8aa0: 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72  arate sqlite3Btr
8ab0: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
8ac0: 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73  ) routine to res
8ad0: 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a  tore a cursor.**
8ae0: 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69   back to where i
8af0: 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66  t ought to be if
8b00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
8b10: 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  turns true..*/.i
8b20: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
8b30: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
8b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
8b50: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53   return pCur->eS
8b60: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
8b70: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ID;.}../*.** Ret
8b80: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8b90: 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72   a fake BtCursor
8ba0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c   object that wil
8bb0: 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a  l always answer.
8bc0: 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20  ** false to the 
8bd0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
8be0: 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75  orHasMoved() rou
8bf0: 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65  tine above.  The
8c00: 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20   fake.** cursor 
8c10: 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f  returned must no
8c20: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
8c30: 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69  ny other Btree i
8c40: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43  nterface..*/.BtC
8c50: 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74  ursor *sqlite3Bt
8c60: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
8c70: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  or(void){.  stat
8c80: 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72  ic u8 fakeCursor
8c90: 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
8ca0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
8cb0: 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53  tof(BtCursor, eS
8cc0: 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  tate)==0 );.  re
8cd0: 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29  turn (BtCursor*)
8ce0: 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a  &fakeCursor;.}..
8cf0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8d00: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
8d10: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
8d20: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
8d30: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
8d40: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
8d50: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
8d60: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
8d70: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
8d80: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
8d90: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
8da0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
8db0: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
8dc0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
8dd0: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
8de0: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
8df0: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
8e00: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
8e10: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
8e20: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
8e30: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
8e40: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
8e50: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
8e60: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
8e70: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
8e80: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
8e90: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
8ea0: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
8eb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8ec0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
8ed0: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
8ee0: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
8ef0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
8f00: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
8f10: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
8f20: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
8f30: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
8f40: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
8f50: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
8f60: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
8f70: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
8f80: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
8f90: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
8fa0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
8fb0: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
8fc0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
8fd0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
8fe0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
8ff0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
9000: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
9010: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
9020: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
9030: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
9040: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
9050: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
9060: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
9070: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
9080: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
9090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
90a0: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
90b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
90c0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
90d0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
90e0: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
90f0: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
9100: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
9110: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
9120: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
9130: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
9140: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9150: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
9160: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
9170: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
9180: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
9190: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
91a0: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
91b0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
91c0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
91d0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
91e0: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
91f0: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
9200: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
9210: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
9220: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
9230: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
9240: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
9250: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
9260: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9270: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
9280: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
9290: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
92a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
92b0: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
92c0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
92d0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
92e0: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
92f0: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
9300: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9310: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
9320: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
9330: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
9340: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
9350: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
9360: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
9370: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
9380: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
9390: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
93a0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
93b0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
93c0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
93d0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
93e0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
93f0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
9400: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
9410: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
9420: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
9430: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
9440: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
9450: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
9460: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
9470: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
9480: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
9490: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
94a0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
94b0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
94c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
94d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
94e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
94f0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
9500: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
9510: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
9520: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
9530: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
9540: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
9550: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
9560: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
9570: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
9580: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
9590: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
95a0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
95b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
95c0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
95d0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
95e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
95f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9600: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
9610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
9620: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
9630: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
9640: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
9650: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
9660: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
9670: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
9680: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
9690: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
96a0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
96b0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
96c0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
96d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
96e0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
96f0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
9700: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
9710: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
9720: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
9730: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
9740: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
9750: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
9760: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
9770: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
9780: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
9790: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
97a0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
97b0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
97c0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
97d0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
97e0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
97f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
9800: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
9810: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
9820: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
9830: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
9840: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9850: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
9860: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
9870: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
9880: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
9890: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
98a0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
98b0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
98c0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
98d0: 62 65 72 20 69 73 20 6e 65 76 65 72 20 61 64 64  ber is never add
98e0: 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  ed to a pointer-
98f0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
9900: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
9910: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
9920: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9930: 74 29 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  t)) );..#ifndef 
9940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
9950: 55 52 52 45 4e 54 0a 20 20 69 66 28 20 70 42 74  URRENT.  if( pBt
9960: 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70  ->pMap ){.    *p
9970: 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  RC = btreePtrmap
9980: 53 74 6f 72 65 28 70 42 74 2c 20 6b 65 79 2c 20  Store(pBt, key, 
9990: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a  eType, parent);.
99a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
99b0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
99c0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
99d0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
99e0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
99f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9a00: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
9a10: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
9a20: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
9a30: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
9a40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
9a50: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
9a60: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
9a70: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
9a80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9a90: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
9aa0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
9ab0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
9ac0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
9ad0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
9ae0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
9af0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
9b00: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
9b10: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
9b20: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
9b30: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
9b40: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
9b50: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
9b60: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
9b70: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
9b80: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
9b90: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
9ba0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
9bb0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
9bc0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
9bd0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
9be0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
9bf0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
9c00: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
9c10: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
9c20: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
9c30: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
9c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9c50: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
9c60: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
9c70: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
9c80: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
9c90: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
9ca0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
9cb0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
9cc0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
9cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
9ce0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
9cf0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
9d00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
9d10: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
9d20: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
9d30: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
9d40: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
9d50: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
9d60: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
9d70: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
9d80: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
9d90: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
9da0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
9db0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
9dc0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
9dd0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
9de0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
9df0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
9e00: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
9e10: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
9e20: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
9e30: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
9e40: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
9e50: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
9e60: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
9e70: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
9e80: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
9e90: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
9ea0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
9eb0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
9ec0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
9ed0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
9ee0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
9ef0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
9f00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9f10: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
9f20: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
9f30: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
9f40: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
9f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9f60: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
9f70: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
9f80: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
9f90: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
9fa0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
9fb0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
9fc0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
9fd0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
9fe0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
9ff0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
a000: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
a010: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
a020: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
a030: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
a040: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a050: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
a060: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
a070: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
a080: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
a090: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
a0a0: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
a0b0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
a0c0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
a0d0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
a0e0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
a0f0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
a100: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
a110: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
a120: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
a130: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a140: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74  CORRUPT_PGNO(iPt
a150: 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  rmap);.  return 
a160: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
a170: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
a180: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
a190: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
a1a0: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
a1b0: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
a1c0: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
a1d0: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
a1e0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
a1f0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
a200: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
a210: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
a220: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
a230: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
a240: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
a250: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
a260: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
a270: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
a280: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
a290: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
a2a0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
a2b0: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
a2c0: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
a2d0: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
a2e0: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
a2f0: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
a300: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
a310: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
a320: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
a330: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
a340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
a350: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
a360: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
a370: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
a380: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
a390: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
a3a0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
a3b0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
a3c0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
a3d0: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
a3e0: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
a3f0: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
a400: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
a410: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
a420: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
a430: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
a440: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
a450: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
a460: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
a470: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
a480: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
a490: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
a4a0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
a4b0: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
a4c0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
a4d0: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
a4e0: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
a4f0: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
a500: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
a510: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
a520: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
a530: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
a540: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
a550: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
a560: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
a570: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
a580: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
a590: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
a5a0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
a5b0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
a5c0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
a5d0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a5e0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
a5f0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
a600: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
a610: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
a620: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a630: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
a640: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
a650: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
a660: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
a670: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
a680: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
a690: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
a6a0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
a6b0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
a6c0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
a6d0: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
a6e0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
a6f0: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
a700: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
a710: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
a720: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
a730: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
a740: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
a750: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
a760: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
a770: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
a780: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
a790: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
a7a0: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
a7b0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
a7c0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
a7d0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
a7e0: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
a7f0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
a800: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
a810: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
a820: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
a830: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
a840: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
a850: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
a860: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
a870: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
a880: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
a890: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
a8a0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
a8b0: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
a8c0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
a8d0: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
a8e0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
a8f0: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
a900: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
a910: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
a920: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
a930: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a940: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
a950: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
a960: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
a970: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
a980: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
a990: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
a9a0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
a9b0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
a9c0: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
a9d0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
a9e0: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
a9f0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
aa00: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
aa10: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
aa20: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
aa30: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
aa40: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
aa50: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
aa60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
aa70: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
aa80: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
aa90: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
aaa0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
aab0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
aac0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
aad0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
aae0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
aaf0: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
ab00: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
ab10: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
ab20: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
ab30: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
ab40: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
ab50: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
ab60: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
ab70: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
ab80: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
ab90: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
aba0: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
abb0: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
abc0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
abd0: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
abe0: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
abf0: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
ac00: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
ac10: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
ac20: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
ac30: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
ac40: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
ac50: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
ac60: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
ac70: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
ac80: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
ac90: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
aca0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
acb0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
acc0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
acd0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
ace0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
acf0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
ad00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ad10: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ad20: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ad30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ad40: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
ad50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ad60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
ad70: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
ad80: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
ad90: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
ada0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
adb0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
adc0: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
add0: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
ade0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
adf0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
ae00: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
ae10: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
ae20: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
ae30: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
ae40: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
ae50: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
ae60: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
ae70: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
ae80: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
ae90: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
aea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
aeb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
aec0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
aed0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
aee0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
aef0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
af00: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af20: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
af30: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
af40: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
af50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
af60: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
af70: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
af80: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
af90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
afa0: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
afb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
afc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
afd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
afe0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
aff0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
b000: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
b010: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
b020: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
b030: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b040: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
b050: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
b060: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
b070: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
b080: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
b090: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
b0a0: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
b0b0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
b0c0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
b0d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
b0e0: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
b0f0: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
b100: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
b110: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
b120: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
b130: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
b140: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
b150: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
b160: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
b170: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
b180: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
b190: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
b1a0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
b1b0: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
b1c0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
b1d0: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
b1e0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
b1f0: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
b200: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
b210: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
b220: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
b230: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
b240: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
b250: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
b260: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
b270: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
b280: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
b290: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
b2a0: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
b2b0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
b2c0: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
b2d0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
b2e0: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
b2f0: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
b300: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
b310: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
b320: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
b330: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
b340: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
b350: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
b360: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
b370: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b380: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b390: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
b3a0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
b3b0: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
b3c0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
b3d0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
b3e0: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
b3f0: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
b400: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
b410: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
b420: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
b430: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
b440: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
b450: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
b460: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
b470: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
b480: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
b490: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
b4a0: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
b4b0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
b4c0: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
b4d0: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
b4e0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
b4f0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
b500: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
b510: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
b520: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
b530: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
b540: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
b550: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
b560: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
b570: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
b580: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
b590: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
b5a0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
b5b0: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
b5c0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
b5d0: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
b5e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
b600: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
b610: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
b620: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
b630: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
b640: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
b650: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
b660: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
b670: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
b680: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
b690: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
b6a0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
b6b0: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
b6c0: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
b6d0: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
b6e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
b6f0: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
b700: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
b710: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b720: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b730: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
b740: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
b750: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
b760: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
b770: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
b780: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
b790: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
b7a0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
b7b0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
b7c0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
b7d0: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
b7e0: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
b7f0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
b800: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
b810: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
b820: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
b830: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
b840: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
b850: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
b860: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
b870: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
b880: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
b890: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
b8a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
b8b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
b8c0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
b8d0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
b8e0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
b8f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
b900: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
b910: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
b920: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
b930: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
b940: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
b950: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
b960: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
b970: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
b980: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
b990: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
b9a0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
b9b0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
b9c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
b9d0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
b9e0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
b9f0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ba00: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
ba10: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
ba20: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
ba30: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
ba40: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
ba50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
ba60: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
ba70: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
ba80: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
ba90: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
baa0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
bab0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
bac0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
bad0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
bae0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
baf0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bb10: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
bb20: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
bb30: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
bb40: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
bb50: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
bb60: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
bb70: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
bb80: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
bb90: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
bba0: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
bbb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
bbc0: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
bbd0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
bbe0: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
bbf0: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
bc00: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
bc10: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
bc20: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
bc30: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
bc40: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
bc50: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
bc60: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
bc70: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
bc80: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
bc90: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
bca0: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
bcb0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
bcc0: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
bcd0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
bce0: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
bcf0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
bd00: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
bd10: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
bd20: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
bd30: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
bd50: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
bd60: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
bd70: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
bd80: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
bd90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
bda0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
bdb0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
bdc0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
bdd0: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
bde0: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
bdf0: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
be00: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
be30: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
be40: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be70: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
be80: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
be90: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
bea0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
beb0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
bec0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
bed0: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
bee0: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
bef0: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
bf00: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
bf10: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
bf20: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
bf30: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
bf40: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
bf50: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
bf60: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
bf70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
bf80: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
bf90: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
bfa0: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
bfb0: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
bfc0: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
bfd0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
bfe0: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
bff0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
c000: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
c010: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
c020: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
c030: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
c040: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
c050: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
c060: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
c070: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
c080: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
c090: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
c0a0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
c0b0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
c0c0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
c0d0: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
c0e0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
c0f0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
c100: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
c110: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
c120: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
c130: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
c140: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
c150: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
c160: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
c170: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
c180: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
c190: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
c1a0: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
c1b0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
c1c0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
c1d0: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
c1e0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
c1f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
c200: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
c210: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
c220: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
c230: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
c240: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
c250: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
c260: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
c270: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
c280: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
c290: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
c2a0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
c2b0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
c2c0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
c2d0: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
c2e0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
c2f0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
c300: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
c310: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
c320: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
c330: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
c340: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
c350: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
c360: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
c370: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
c380: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
c390: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
c3a0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
c3b0: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
c3c0: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
c3d0: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
c3e0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
c3f0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
c400: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
c410: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
c420: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
c430: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
c440: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
c450: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
c460: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
c470: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
c480: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
c490: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
c4a0: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
c4b0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
c4c0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
c4d0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c4e0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
c4f0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
c500: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
c510: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
c520: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
c530: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
c540: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
c550: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
c560: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
c570: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
c580: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
c590: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
c5a0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
c5b0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
c5c0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
c5d0: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
c5e0: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
c5f0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
c600: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
c610: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
c620: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
c630: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
c640: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
c650: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
c660: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
c670: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
c680: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
c690: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
c6a0: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
c6b0: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
c6c0: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
c6d0: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
c6e0: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
c6f0: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
c700: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
c710: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c720: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
c730: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
c740: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
c750: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
c760: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
c770: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
c780: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
c790: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
c7a0: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
c7b0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
c7c0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
c7d0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
c7e0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
c7f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c800: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
c810: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
c820: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
c830: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
c840: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
c850: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
c860: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
c870: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
c880: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
c890: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
c8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
c8b0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
c8c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
c8d0: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
c8e0: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
c8f0: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
c900: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
c910: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
c920: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
c930: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
c940: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
c950: 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
c960: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
c970: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
c980: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
c990: 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20  fo.nSize-4]);.  
c9a0: 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67    ptrmapPut(pPag
c9b0: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
c9c0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
c9d0: 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43  pPage->pgno, pRC
c9e0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
c9f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
ca00: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
ca10: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
ca20: 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c  reorganizes cell
ca30: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
ca40: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
ca50: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62  re are no free-b
ca60: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65  locks on the fre
ca70: 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a  e-block list..**
ca80: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d  .** Parameter nM
ca90: 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61  axFrag is the ma
caa0: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
cab0: 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  fragmented space
cac0: 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
cad0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70  present in the p
cae0: 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72  age after this r
caf0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
cb00: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
cb10: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
cb20: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
cb30: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
cb40: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
cb50: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
cb60: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
cb70: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
cb80: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
cb90: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
cba0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
cbb0: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
cbc0: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
cbd0: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
cbe0: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
cbf0: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
cc00: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
cc10: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
cc20: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
cc30: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61   *pPage, int nMa
cc40: 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b  xFrag){.  int i;
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cc70: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
cc80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cc90: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
cca0: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
ccb0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
cce0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
ccf0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd10: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
cd20: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
cd30: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
cd40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
cd50: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
cd60: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
cd70: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
cd80: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
cd90: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
cda0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
cdb0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
cdc0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
cdd0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
cde0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
cdf0: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
ce00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ce10: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
ce20: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
ce30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
ce40: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
ce50: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
ce60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
ce70: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
ce80: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
ce90: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e   content */.  un
cea0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63  signed char *src
ceb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ;        /* Sour
cec0: 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ce of content */
ced0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
cee0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
cef0: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
cf00: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
cf10: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
cf30: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
cf40: 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73  l index */..  as
cf50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
cf60: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
cf70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
cf80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
cf90: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
cfa0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
cfb0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
cfc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
cfd0: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
cfe0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
cff0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
d000: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d010: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
d020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
d030: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
d040: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
d050: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
d060: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
d070: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
d080: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
d090: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
d0a0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
d0b0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
d0c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
d0d0: 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   );.  iCellFirst
d0e0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
d0f0: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c  2*nCell;.  usabl
d100: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
d110: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
d120: 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
d130: 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77   handles pages w
d140: 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72  ith two or fewer
d150: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64   free blocks and
d160: 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f   nMaxFrag.  ** o
d170: 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74  r fewer fragment
d180: 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69  ed bytes. In thi
d190: 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73  s case it is fas
d1a0: 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a  ter to move the.
d1b0: 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65    ** two (or one
d1c0: 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c  ) blocks of cell
d1d0: 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28  s using memmove(
d1e0: 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65  ) and add the re
d1f0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73  quired.  ** offs
d200: 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e  ets to each poin
d210: 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  ter in the cell-
d220: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68  pointer array th
d230: 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a  an it is to .  *
d240: 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68  * reconstruct th
d250: 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20  e entire page.  
d260: 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61  */.  if( (int)da
d270: 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46  ta[hdr+7]<=nMaxF
d280: 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  rag ){.    int i
d290: 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28  Free = get2byte(
d2a0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
d2b0: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
d2c0: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
d2d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d2e0: 61 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20  a[iFree]);..    
d2f0: 20 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f    /* pageFindSlo
d300: 74 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  t() has already 
d310: 76 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72  verified that fr
d320: 65 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f  ee blocks are so
d330: 72 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rted.      ** in
d340: 20 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74   order of offset
d350: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
d360: 2c 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c  , and that no bl
d370: 6f 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ock extends.    
d380: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
d390: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50  d of the page. P
d3a0: 72 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20  rovided the two 
d3b0: 66 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f  free slots do no
d3c0: 74 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  t .      ** over
d3d0: 6c 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e  lap, this guaran
d3e0: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65  tees that the me
d3f0: 6d 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65  mmove() calls be
d400: 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
d410: 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20     ** overwrite 
d420: 74 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62  the usableSize b
d430: 79 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e  yte buffer, even
d440: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
d450: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
d460: 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  s corrupt.  */. 
d470: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
d480: 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32  ee2==0 || iFree2
d490: 3e 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  >iFree );.      
d4a0: 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65  assert( iFree+ge
d4b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
d4c0: 65 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65  ee+2]) <= usable
d4d0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
d4e0: 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20  sert( iFree2==0 
d4f0: 7c 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79  || iFree2+get2by
d500: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
d510: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
d520: 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
d530: 30 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61  0==iFree2 || (da
d540: 74 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26  ta[iFree2]==0 &&
d550: 20 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d   data[iFree2+1]=
d560: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  =0) ){.        u
d570: 38 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b  8 *pEnd = &data[
d580: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
d590: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75  ll*2];.        u
d5a0: 38 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20  8 *pAddr;.      
d5b0: 20 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20    int sz2 = 0;. 
d5c0: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
d5d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d5e0: 46 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20  Free+2]);.      
d5f0: 20 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32    int top = get2
d600: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d610: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
d620: 74 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20  top>=iFree ){.  
d630: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
d650: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
d660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d670: 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20   iFree2 ){.     
d680: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
d690: 65 65 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b  ee+sz<=iFree2 );
d6a0: 20 2f 2a 20 56 65 72 69 66 69 65 64 20 62 79 20   /* Verified by 
d6b0: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a  pageFindSlot() *
d6c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32 20  /.          sz2 
d6d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d6e0: 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20  [iFree2+2]);.   
d6f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
d700: 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65  Free+sz+sz2+iFre
d710: 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d  e2-(iFree+sz) <=
d720: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
d730: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
d740: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
d750: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
d760: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
d770: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
d780: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
d790: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d7a0: 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b    cbrk = top+sz;
d7b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d7c0: 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70   cbrk+(iFree-top
d7d0: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
d7e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
d7f0: 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ve(&data[cbrk], 
d800: 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65  &data[top], iFre
d810: 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  e-top);.        
d820: 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b  for(pAddr=&data[
d830: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64  cellOffset]; pAd
d840: 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d  dr<pEnd; pAddr+=
d850: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63  2){.          pc
d860: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
d870: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
d880: 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75  ( pc<iFree ){ pu
d890: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
d8a0: 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  +sz); }.        
d8b0: 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46    else if( pc<iF
d8c0: 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74 65  ree2 ){ put2byte
d8d0: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b  (pAddr, pc+sz2);
d8e0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d8f0: 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67       goto defrag
d900: 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ment_out;.      
d910: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  }.    }.  }..  c
d920: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
d930: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
d940: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
d950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
d960: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
d970: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
d980: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
d990: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
d9a0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
d9b0: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
d9c0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
d9d0: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
d9e0: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
d9f0: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
da00: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
da10: 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ast );.    /* Th
da20: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
da30: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
da40: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
da50: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
da60: 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65   ** if PRAGMA ce
da70: 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
da80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
da90: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
daa0: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
dab0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
dac0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
dad0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
dae0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
daf0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
db00: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
db10: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
db20: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
db30: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
db40: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
db50: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
db60: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
db70: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
db80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
db90: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
dba0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
dbb0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
dbc0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
dbd0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
dbe0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
dbf0: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
dc00: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
dc10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
dc20: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
dc30: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
dc40: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
dc50: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
dc60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
dc70: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
dc80: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
dc90: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
dca0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
dcb0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
dcc0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
dcd0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
dce0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
dcf0: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
dd00: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
dd10: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
dd20: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
dd30: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
dd40: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
dd50: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
dd60: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
dd70: 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74   0;.. defragment
dd80: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61  _out:.  if( data
dd90: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
dda0: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
ddb0: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
ddc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ddd0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
dde0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
ddf0: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
de00: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
de10: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
de20: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
de30: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
de40: 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  2] = 0;.  memset
de50: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
de60: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
de70: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
de80: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
de90: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
dea0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
deb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dec0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
ded0: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
dee0: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
def0: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
df00: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
df10: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
df20: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
df30: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
df40: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
df50: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
df60: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
df70: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
df80: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
df90: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
dfa0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
dfb0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
dfc0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
dfd0: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
dfe0: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
dff0: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
e000: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
e010: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
e020: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
e030: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
e040: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
e050: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
e060: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
e070: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
e080: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
e090: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
e0a0: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
e0b0: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
e0c0: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
e0d0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
e0e0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
e0f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
e100: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
e110: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
e120: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
e130: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
e140: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
e150: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
e160: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
e170: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
e180: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
e190: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
e1a0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
e1b0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
e1c0: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
e1d0: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
e1e0: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
e1f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
e200: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
e210: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e220: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
e230: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  /..  assert( pc>
e240: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  0 );.  while( pc
e250: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  <=usableSize-4 )
e260: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e270: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
e280: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
e290: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
e2a0: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
e2b0: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
e2c0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
e2d0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
e2e0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
e2f0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
e300: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
e310: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
e320: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
e330: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
e340: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
e350: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
e360: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
e370: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
e380: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e390: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
e3a0: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
e3b0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
e3c0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
e3d0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
e3e0: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
e3f0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
e400: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
e410: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
e420: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
e430: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
e440: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
e450: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
e460: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
e470: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
e480: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
e490: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
e4a0: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
e4b0: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
e4c0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
e4d0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
e4e0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
e4f0: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
e500: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
e510: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
e520: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
e530: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
e540: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
e550: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
e560: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
e570: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
e580: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )x;.      }else{
e590: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
e5a0: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
e5b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
e5c0: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
e5d0: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
e5e0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
e5f0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
e600: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
e610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
e620: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
e630: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
e640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
e650: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
e660: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
e670: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
e680: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
e690: 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64  ;.    if( pc<iAd
e6a0: 64 72 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b  dr+size ) break;
e6b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b  .  }.  if( pc ){
e6c0: 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49  .    *pRc = SQLI
e6d0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e6e0: 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
e6f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e700: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
e710: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
e720: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
e730: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
e740: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
e750: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
e760: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
e770: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
e780: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
e790: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
e7a0: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
e7b0: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
e7c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
e7d0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
e7e0: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
e7f0: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
e800: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
e810: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
e820: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
e830: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
e840: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
e850: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
e860: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
e870: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
e880: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
e890: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
e8a0: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
e8b0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
e8c0: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
e8d0: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
e8e0: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
e8f0: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
e900: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
e910: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
e920: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
e930: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
e940: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
e950: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
e960: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
e970: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
e980: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
e990: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
e9a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
e9b0: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
e9c0: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
e9d0: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
e9e0: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
e9f0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
ea00: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ea10: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
ea20: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
ea30: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
ea40: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
ea50: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
ea60: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ea90: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
eaa0: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
eab0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
eae0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
eaf0: 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20   gap;        /* 
eb00: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61  First byte of ga
eb10: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70  p between cell p
eb20: 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c  ointers and cell
eb30: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20   content */.  . 
eb40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eb50: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
eb60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
eb70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
eb80: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
eb90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
eba0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ebb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ebc0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
ebd0: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
ebe0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
ebf0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
ec00: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
ec10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ec20: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
ec30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
ec40: 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61  Byte < (int)(pPa
ec50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ec60: 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73  ize-8) );..  ass
ec70: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
ec80: 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20  Offset == hdr + 
ec90: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
eca0: 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50  af );.  gap = pP
ecb0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ecc0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
ecd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c  ;.  assert( gap<
ece0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45  =65536 );.  /* E
ecf0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
ed00: 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65  356-02391 If the
ed10: 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61   database uses a
ed20: 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65   65536-byte page
ed30: 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74   size.  ** and t
ed40: 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63  he reserved spac
ed50: 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75  e is zero (the u
ed60: 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72  sual value for r
ed70: 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20  eserved space). 
ed80: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c   ** then the cel
ed90: 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  l content offset
eda0: 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67   of an empty pag
edb0: 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35  e wants to be 65
edc0: 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65  536..  ** Howeve
edd0: 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20  r, that integer 
ede0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
edf0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32  be stored in a 2
ee00: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20  -byte unsigned. 
ee10: 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20   ** integer, so 
ee20: 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20  a value of 0 is 
ee30: 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63  used in its plac
ee40: 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  e. */.  top = ge
ee50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ee60: 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +5]);.  assert( 
ee70: 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d  top<=(int)pPage-
ee80: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ee90: 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62   ); /* Prevent b
eea0: 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  y getAndInitPage
eeb0: 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e  () */.  if( gap>
eec0: 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74  top ){.    if( t
eed0: 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  op==0 && pPage->
eee0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d  pBt->usableSize=
eef0: 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20  =65536 ){.      
ef00: 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20  top = 65536;.   
ef10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
ef20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ef30: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
ef40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ef50: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
ef60: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
ef70: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
ef80: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
ef90: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
efa0: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
efb0: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
efc0: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
efd0: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
efe0: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
eff0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
f000: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
f010: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
f020: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
f030: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
f040: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
f050: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
f060: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
f070: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
f080: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
f090: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
f0a0: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
f0b0: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
f0c0: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
f0d0: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
f0e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
f0f0: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
f100: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
f110: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
f120: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
f130: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
f140: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
f150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f160: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
f170: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
f180: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f190: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
f1a0: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
f1b0: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
f1c0: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
f1d0: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
f1e0: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
f1f0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
f200: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
f210: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
f220: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
f230: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
f240: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
f250: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
f260: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
f270: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
f280: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
f290: 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65  ge, MIN(4, pPage
f2a0: 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79  ->nFree - (2+nBy
f2b0: 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  te)));.    if( r
f2c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
f2d0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
f2e0: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
f2f0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
f300: 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c  rt( gap+2+nByte<
f310: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
f320: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
f330: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
f340: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
f350: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
f360: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
f370: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f380: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
f390: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
f3a0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
f3b0: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
f3c0: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
f3d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
f3e0: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
f3f0: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
f400: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
f410: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
f420: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
f430: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
f440: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
f450: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
f460: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
f470: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
f480: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
f490: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
f4a0: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
f4b0: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
f4c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
f4d0: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
f4e0: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
f4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f500: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
f510: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
f520: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
f530: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
f540: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
f550: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
f560: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
f570: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
f580: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
f590: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
f5a0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
f5b0: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
f5c0: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
f5d0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
f5e0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
f5f0: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
f600: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
f610: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
f620: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
f630: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
f640: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
f650: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
f660: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
f670: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
f680: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
f690: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
f6a0: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
f6b0: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
f6c0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
f6d0: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
f6e0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
f6f0: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
f700: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
f710: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f720: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
f730: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
f740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
f750: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
f760: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
f770: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
f780: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
f7b0: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
f7c0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
f7d0: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
f800: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
f810: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
f820: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
f850: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
f860: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
f870: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
f880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f890: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
f8a0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
f8b0: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
f8c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
f8d0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
f8e0: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
f8f0: 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20  */.  u16 x;     
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
f920: 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
f930: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75  tent area */.  u
f940: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
f950: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
f960: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
f970: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
f980: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
f990: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
f9a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
f9b0: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
f9c0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
f9d0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
f9e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
f9f0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
fa00: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
fa10: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
fa20: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
fa30: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
fa40: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
fa50: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
fa60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
fa70: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
fa80: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
fa90: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
faa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fab0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
fac0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
fad0: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
fae0: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
faf0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
fb00: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
fb10: 53 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42  Start<=pPage->pB
fb20: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
fb30: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73  );..  /* The lis
fb40: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
fb50: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
fb60: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
fb70: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
fb80: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
fb90: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
fba0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
fbb0: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
fbc0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
fbd0: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
fbe0: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
fbf0: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
fc00: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
fc10: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
fc20: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
fc30: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
fc40: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
fc50: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
fc60: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
fc70: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
fc80: 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74  a[iPtr]))<iStart
fc90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
fca0: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b  reeBlk<iPtr+4 ){
fcb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
fcc0: 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b  eeBlk==0 ) break
fcd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fce0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fcf0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
fd00: 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20     }.      iPtr 
fd10: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
fd20: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
fd30: 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  lk>pPage->pBt->u
fd40: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
fd50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fd60: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
fd70: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
fd80: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
fd90: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
fda0: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
fdb0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
fdc0: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
fdd0: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
fde0: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
fdf0: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
fe00: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
fe10: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
fe20: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
fe30: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
fe40: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
fe50: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
fe60: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
fe70: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
fe80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
fe90: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
fea0: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
feb0: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
fec0: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
fed0: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
fee0: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
fef0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
ff00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ff10: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
ff20: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
ff30: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
ff40: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
ff50: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
ff60: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
ff70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
ff80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ff90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ffa0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
ffb0: 20 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d   }.      iSize =
ffc0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
ffd0: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
ffe0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
fff0: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
10000 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
10010 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
10020 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
10030 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
10040 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
10050 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
10060 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
10070 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
10080 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
10090 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
100a0 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
100b0 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
100c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
100d0 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
100e0 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
100f0 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
10100 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
10110 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
10120 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
10130 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
10140 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
10150 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10160 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10170 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
10180 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
10190 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
101a0 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
101b0 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
101c0 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
101d0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
101e0 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
101f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10200 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10210 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
10220 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
10230 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28  .  x = get2byte(
10240 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
10250 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29   if( iStart<=x )
10260 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
10270 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
10280 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
10290 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
102a0 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
102b0 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
102c0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
102d0 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
102e0 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
102f0 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
10300 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
10310 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74   iStart<x || iPt
10320 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
10330 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10340 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
10350 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10360 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
10370 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
10380 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
10390 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
103a0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
103b0 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
103c0 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
103d0 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
103e0 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
103f0 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tart);.  }.  if(
10400 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73   pPage->pBt->bts
10410 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
10420 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f  _SECURE ){.    /
10430 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
10440 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
10450 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
10460 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
10470 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  e.    ** option 
10480 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
10490 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
104a0 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
104b0 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
104c0 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
104d0 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75   iFreeBlk);.  pu
104e0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
104f0 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
10500 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
10510 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
10520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
10540 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
10550 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
10560 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
10570 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
10580 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
10590 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
105a0 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
105b0 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
105c0 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
105d0 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
105e0 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
105f0 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
10600 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
10610 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
10620 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
10630 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
10640 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
10650 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
10660 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
10670 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
10680 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
10690 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
106a0 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
106b0 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
106c0 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
106d0 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
106e0 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
106f0 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
10700 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
10710 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
10720 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
10730 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10740 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
10750 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
10760 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10770 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
10780 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
10790 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
107a0 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
107b0 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
107c0 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
107d0 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
107e0 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
107f0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
10800 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
10810 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43  eaf;.  pPage->xC
10820 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
10830 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70  zePtr;.  pBt = p
10840 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
10850 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
10860 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
10870 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a  NTKEY) ){.    /*
10880 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10890 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61  07291-35328 A va
108a0 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20  lue of 5 (0x05) 
108b0 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
108c0 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
108d0 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65  rior table b-tre
108e0 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
108f0 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
10900 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
10910 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
10920 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39  IDENCE-OF: R-269
10930 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65  00-09176 A value
10940 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65   of 13 (0x0d) me
10950 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
10960 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61  a.    ** leaf ta
10970 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
10980 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10990 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
109a0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
109b0 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
109c0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
109d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
109e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
109f0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
10a00 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
10a10 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
10a20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
10a30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10a40 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
10a50 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
10a60 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
10a70 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f   = cellSizePtrNo
10a80 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70  Payload;.      p
10a90 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
10aa0 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
10ab0 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  lPtrNoPayload;. 
10ac0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
10ad0 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
10ae0 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
10af0 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
10b00 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
10b10 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
10b20 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
10b30 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
10b40 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33  CE-OF: R-43316-3
10b50 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20  7308 A value of 
10b60 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74  2 (0x02) means t
10b70 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
10b80 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e    ** interior in
10b90 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
10ba0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10bb0 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
10bc0 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
10bd0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35  ENCE-OF: R-59615
10be0 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f  -42828 A value o
10bf0 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e  f 10 (0x0a) mean
10c00 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
10c10 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65      ** leaf inde
10c20 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
10c30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
10c40 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
10c50 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
10c60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
10c70 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
10c80 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
10c90 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
10ca0 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
10cb0 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
10cc0 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
10cd0 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
10ce0 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
10cf0 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
10d00 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
10d10 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
10d20 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
10d30 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
10d40 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
10d50 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
10d60 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
10d70 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
10d80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10d90 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
10da0 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
10db0 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
10dc0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
10dd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10de0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
10df0 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
10e00 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
10e10 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
10e20 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
10e30 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
10e40 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
10e50 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
10e60 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
10e70 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
10e80 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
10e90 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
10ea0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
10eb0 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
10ec0 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
10ed0 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
10ee0 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
10ef0 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
10f00 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
10f10 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
10f20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
10f30 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
10f40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
10f50 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
10f60 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
10f70 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
10f80 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10f90 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
10fa0 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
10fb0 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  [] */.  u8 hdr; 
10fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10fd0 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
10fe0 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
10ff0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
11000 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
11010 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
11020 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
11030 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
11040 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
11050 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
11060 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
11070 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
11080 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
11090 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36  ch page */.  u16
110a0 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
110b0 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
110c0 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
110d0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
110e0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
110f0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
11100 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
11110 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
11120 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
11130 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
11140 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
11150 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
11160 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
11170 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
11180 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
11190 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
111a0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  set */.  int iCe
111b0 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
111c0 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
111d0 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
111e0 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ffset */..  asse
111f0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
11200 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11210 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
11220 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11230 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11240 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
11250 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11260 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
11270 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
11280 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
11290 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
112a0 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
112b0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
112c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
112d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
112e0 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
112f0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11300 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11320 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  age->isInit==0 )
11330 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ;..  pBt = pPage
11340 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70  ->pBt;.  hdr = p
11350 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
11360 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
11370 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49  >aData;.  /* EVI
11380 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
11390 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
113a0 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
113b0 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
113c0 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
113d0 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
113e0 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
113f0 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
11400 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
11410 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11420 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
11430 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11440 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
11450 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
11460 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
11470 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
11480 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
11490 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
114a0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
114b0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
114c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
114d0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
114e0 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
114f0 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
11500 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
11510 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
11520 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
11530 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
11540 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
11550 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
11560 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
11570 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
11580 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
11590 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
115a0 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
115b0 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
115c0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
115d0 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a   designates.  **
115e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
115f0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
11600 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
11610 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
11620 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72  er is.  ** inter
11630 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
11640 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
11650 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
11660 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20  a[hdr+5]);.  /* 
11670 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
11680 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
11690 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
116a0 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
116b0 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
116c0 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
116d0 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61  e page. */.  pPa
116e0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
116f0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
11700 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ]);.  if( pPage-
11710 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
11720 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f  Bt) ){.    /* To
11730 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
11740 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
11750 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
11760 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
11770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11780 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
11790 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
117a0 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
117b0 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
117c0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
117d0 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
117e0 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
117f0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
11800 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a  ich is only.  **
11810 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
11820 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
11830 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
11840 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
11850 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74   the.  ** offset
11860 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
11870 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
11880 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
11890 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a  ze minus the.  *
118a0 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72  * bytes of reser
118b0 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ved space. */.  
118c0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
118d0 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
118e0 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
118f0 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a  RUPT_DB );..  /*
11900 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
11910 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
11920 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
11930 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
11940 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
11950 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
11960 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65    .  **.  ** The
11970 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
11980 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
11990 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
119a0 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
119b0 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
119c0 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
119d0 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
119e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
119f0 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e   be .  ** return
11a00 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
11a10 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   */.  iCellFirst
11a20 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
11a30 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
11a40 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
11a50 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
11a60 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  if( pBt->db->fla
11a70 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c  gs & SQLITE_Cell
11a80 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e  SizeCk ){.    in
11a90 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11aa0 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
11ab0 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
11ac0 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
11ad0 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
11ae0 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
11af0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  */..    if( !pPa
11b00 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
11b10 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28  Last--;.    for(
11b20 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
11b30 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
11b40 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
11b50 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
11b60 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
11b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
11b80 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
11b90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11ba0 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
11bb0 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
11bc0 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
11bd0 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
11be0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11bf0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
11c00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
11c10 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
11c20 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
11c30 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
11c40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
11c50 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
11c60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b  );.      if( pc+
11c70 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
11c80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11c90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11ca0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
11cb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11cc0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
11cd0 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
11ce0 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }  ..  /* Comput
11cf0 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
11d00 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
11d10 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  ge.  ** EVIDENCE
11d20 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
11d30 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
11d40 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
11d50 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
11d60 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
11d70 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
11d80 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
11d90 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
11da0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65   are no.  ** fre
11db0 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63  eblocks. */.  pc
11dc0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
11dd0 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
11de0 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
11df0 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
11e00 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
11e10 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
11e20 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30  ce */.  if( pc>0
11e30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74   ){.    u32 next
11e40 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
11e50 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  pc<iCellFirst ){
11e60 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
11e70 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
11e80 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
11e90 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
11ea0 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
11eb0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
11ec0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
11ed0 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
11ee0 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
11ef0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
11f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11f10 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
11f20 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c   .    }.    whil
11f30 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
11f40 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  ( pc>iCellLast )
11f50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
11f60 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65  eblock off the e
11f70 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
11f80 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
11f90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11fa0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
11fb0 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
11fc0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
11fd0 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
11fe0 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
11ff0 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
12000 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
12010 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
12020 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
12030 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12040 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
12050 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20  .    if( next>0 
12060 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
12070 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63  block not in asc
12080 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
12090 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
120a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
120b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
120c0 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28     if( pc+size>(
120d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61  unsigned int)usa
120e0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
120f0 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f   /* Last freeblo
12100 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ck extends past 
12110 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  page end */.    
12120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12130 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
12140 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
12150 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
12160 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
12170 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
12180 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
12190 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
121a0 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
121b0 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
121c0 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
121d0 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  s within.  ** th
121e0 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
121f0 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
12200 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
12210 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a   usable-size.  *
12220 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
12230 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
12240 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
12250 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
12260 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
12270 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
12280 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
12290 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
122a0 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61  ontent.  ** area
122b0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
122c0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
122d0 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
122e0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
122f0 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
12300 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
12310 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12320 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
12330 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
12340 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
12350 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50  CellFirst);.  pP
12360 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
12370 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12380 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
12390 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
123a0 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
123b0 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
123c0 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
123d0 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
123e0 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
123f0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
12400 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
12410 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
12420 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
12430 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
12440 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
12450 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
12460 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
12470 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
12480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12490 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
124a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
124b0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
124c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
124d0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
124e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
124f0 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
12500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12510 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
12520 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12530 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
12540 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12550 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
12560 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
12570 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12580 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12590 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
125a0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
125b0 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
125c0 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  RE ){.    memset
125d0 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
125e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
125f0 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
12600 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
12610 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
12620 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
12630 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
12640 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
12650 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
12660 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
12670 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
12680 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
12690 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
126a0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
126b0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
126c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
126d0 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
126e0 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
126f0 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
12700 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
12710 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
12720 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
12730 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
12740 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
12750 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
12760 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
12770 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
12780 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
12790 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
127a0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
127b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
127c0 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
127d0 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
127e0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
127f0 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
12800 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
12810 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
12820 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
12830 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
12840 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
12850 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
12860 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
12870 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
12880 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
12890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
128a0 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
128b0 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
128c0 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
128d0 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
128e0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
128f0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
12900 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
12910 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
12920 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
12930 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
12940 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
12950 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12960 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
12970 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
12980 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
12990 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
129a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
129b0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
129c0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
129d0 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
129e0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
129f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
12a00 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12a10 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
12a20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
12a30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
12a40 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
12a50 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
12a60 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
12a70 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
12a80 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
12a90 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
12aa0 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
12ab0 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
12ac0 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
12ad0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
12ae0 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
12af0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
12b00 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
12b10 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
12b20 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
12b30 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
12b40 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
12b50 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
12b60 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
12b70 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
12b80 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
12b90 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
12ba0 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
12bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
12bc0 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
12bd0 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
12be0 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
12bf0 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
12c00 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
12c10 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
12c20 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
12c30 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
12c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12c50 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
12c60 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12c70 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
12c80 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
12c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12ca0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
12cb0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
12cc0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
12cd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12ce0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
12cf0 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
12d00 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12d10 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12d20 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12d30 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12d40 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
12d50 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
12d60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
12d70 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
12d80 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
12d90 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
12da0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
12db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12dc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12dd0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12de0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12df0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
12e00 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
12e10 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
12e20 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
12e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
12e40 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
12e50 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12e60 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12e70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12e80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
12e90 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
12ea0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
12eb0 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
12ec0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
12ed0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
12ee0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
12ef0 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
12f00 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
12f10 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
12f20 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
12f30 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
12f40 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
12f50 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
12f60 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
12f70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
12f80 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
12f90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12fa0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12fb0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
12fc0 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
12fd0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
12fe0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
12ff0 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
13000 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
13010 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
13020 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
13030 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
13040 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
13050 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
13060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13070 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
13080 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
13090 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
130a0 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
130b0 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
130c0 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
130d0 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
130e0 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
130f0 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
13100 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
13110 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
13120 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
13130 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
13140 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
13150 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
13160 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30 29  age)&0x80000000)
13170 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
13180 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
13190 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
131a0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
131b0 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
131c0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a  nitialize it..**
131d0 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74  .** If pCur!=0 t
131e0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
131f0 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73  being fetched as
13200 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54   part of a moveT
13210 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c  oChild().** call
13220 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  .  Do additional
13230 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
13240 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20   on the page in 
13250 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e  this case..** An
13260 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66  d if the fetch f
13270 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ails, this routi
13280 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e  ne must decremen
13290 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a  t pCur->iPage..*
132a0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73  *.** The page is
132b0 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64   fetched as read
132c0 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43  -write unless pC
132d0 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  ur is not NULL a
132e0 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d  nd is.** a read-
132f0 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  only cursor..**.
13300 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
13310 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50  ccurs, then *ppP
13320 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  age is undefined
13330 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
13340 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
13350 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
13360 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
13370 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
13380 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
13390 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
133a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
133b0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
133c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
133d0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
133f0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
13400 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
13410 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
13420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13430 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
13440 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
13450 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
13460 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
13470 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
13480 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67   receive the pag
13490 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
134a0 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20  int bReadOnly   
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
134d0 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a  ad-only page */.
134e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
134f0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
13500 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13510 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
13520 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13530 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
13540 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e   ppPage==&pCur->
13550 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
13560 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
13570 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
13580 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
13590 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
135a0 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
135b0 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
135c0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
135d0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
135e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
135f0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
13600 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
13610 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
13620 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
13630 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
13640 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
13650 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
13660 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
13670 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
13680 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
13690 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
136a0 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
136b0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
136c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
136d0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
136e0 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
136f0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
13700 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
13710 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
13720 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
13730 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
13740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13750 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
13760 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
13770 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
13780 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
13790 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
137a0 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
137b0 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
137c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
137d0 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
137e0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
137f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
13800 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
13810 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
13820 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
13830 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
13840 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
13850 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
13860 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
13870 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
13880 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
13890 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
138a0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
138b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
138c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
138d0 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65  (pgno);.    rele
138e0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
138f0 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
13900 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
13910 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
13920 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64  LITE_OK;..getAnd
13930 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a  InitPage_error:.
13940 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
13950 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
13960 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
13970 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
13980 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
13990 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  }.  testcase( pg
139a0 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
139b0 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
139c0 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
139d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
139e0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
139f0 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
13a00 4e 54 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 74 68  NT./* .** Set th
13a10 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4d  e value of the M
13a20 65 6d 50 61 67 65 2e 70 67 6e 6f 52 6f 6f 74 20  emPage.pgnoRoot 
13a30 76 61 72 69 61 62 6c 65 2c 20 69 66 20 69 74 20  variable, if it 
13a40 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  exists..*/.stati
13a50 63 20 76 6f 69 64 20 73 65 74 4d 65 6d 70 61 67  c void setMempag
13a60 65 52 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  eRoot(MemPage *p
13a70 50 67 2c 20 75 33 32 20 70 67 6e 6f 52 6f 6f 74  Pg, u32 pgnoRoot
13a80 29 7b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 52 6f  ){.  pPg->pgnoRo
13a90 6f 74 20 3d 20 70 67 6e 6f 52 6f 6f 74 3b 0a 7d  ot = pgnoRoot;.}
13aa0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13ab0 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 78  setMempageRoot(x
13ac0 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,y).#endif../*.*
13ad0 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
13ae0 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
13af0 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
13b00 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
13b10 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
13b20 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  GetPage..**.** P
13b30 61 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61  age1 is a specia
13b40 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20  l case and must 
13b50 62 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  be released usin
13b60 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  g releasePageOne
13b70 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
13b80 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
13b90 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
13ba0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
13bb0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
13bc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13bd0 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
13be0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
13bf0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
13c00 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
13c10 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
13c20 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
13c30 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
13c40 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
13c50 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
13c60 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
13c70 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
13c80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13c90 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
13ca0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
13cb0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
13cc0 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
13cd0 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
13ce0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
13cf0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
13d00 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
13d10 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
13d20 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74  ull(pPage);.}.st
13d30 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
13d40 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
13d50 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
13d60 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
13d70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
13d80 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
13d90 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
13da0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13db0 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
13dc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13dd0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
13de0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
13df0 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
13e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13e10 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
13e20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13e30 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
13e40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13e50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13e60 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
13e70 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
13e80 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
13e90 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
13ea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
13eb0 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
13ec0 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
13ed0 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
13ee0 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
13ef0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
13f00 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
13f10 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
13f20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
13f30 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
13f40 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
13f50 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
13f60 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
13f70 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
13f80 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
13f90 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
13fa0 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
13fb0 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
13fc0 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
13fd0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
13fe0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
13ff0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
14000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14010 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
14020 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
14030 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
14040 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
14050 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
14060 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
14070 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
14080 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
14090 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
140a0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
140b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
140c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
140d0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
140e0 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
140f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14100 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
14110 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
14120 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
14130 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
14140 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
14150 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
14160 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
14170 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14180 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
14190 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
141a0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
141b0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
141c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
141d0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
141e0 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
141f0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
14200 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
14210 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
14220 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
14230 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
14240 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
14250 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
14260 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
14270 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
14280 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
14290 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
142a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
142b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
142c0 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
142d0 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
142e0 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
142f0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
14300 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
14310 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
14320 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
14330 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
14340 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
14350 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
14360 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
14370 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
14380 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
14390 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
143a0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
143b0 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
143c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
143d0 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
143e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
143f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
14400 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
14410 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
14420 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
14430 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
14440 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
14450 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
14460 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
14470 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
14480 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
14490 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
144a0 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
144b0 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
144c0 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
144d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
144e0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
144f0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
14500 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
14510 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
14520 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
14530 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
14540 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
14550 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
14560 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
14570 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
14580 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
14590 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
145a0 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
145b0 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
145c0 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
145d0 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
145e0 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
145f0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
14600 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
14610 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
14620 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
14630 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
14640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
14650 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
14660 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
14670 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
14680 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
14690 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
146a0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
146b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
146c0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
146d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
146e0 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
146f0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
14700 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
14710 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14740 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
14750 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  r));.}../*.** Op
14760 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
14770 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
14780 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
14790 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
147a0 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
147b0 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
147c0 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
147d0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
147e0 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
147f0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
14800 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
14810 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
14820 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
14830 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
14840 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
14850 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
14860 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
14870 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
14880 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
14890 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
148a0 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
148b0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
148c0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
148d0 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
148e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
148f0 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
14900 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
14910 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
14920 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
14930 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
14940 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
14950 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
14960 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
14970 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
14980 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
14990 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
149a0 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
149b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
149c0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
149d0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
149e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
149f0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
14a00 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
14a10 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
14a20 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
14a30 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
14a40 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
14a50 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
14a60 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
14a70 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
14a80 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
14a90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14aa0 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
14ab0 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
14ac0 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
14ad0 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
14ae0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
14af0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
14b00 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
14b10 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
14b20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
14b30 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
14b40 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
14b50 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
14b60 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
14b70 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
14b80 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
14b90 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
14ba0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14bb0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
14bc0 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
14bd0 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
14be0 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
14bf0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
14c00 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
14c10 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
14c20 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
14c30 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
14c40 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
14c50 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
14c60 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
14c70 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
14c80 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
14c90 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
14ca0 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
14cb0 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
14cc0 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
14cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
14ce0 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
14cf0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
14d00 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
14d10 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
14d20 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
14d30 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
14d40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14d50 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
14d60 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
14d70 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
14d80 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
14d90 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
14da0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
14db0 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
14dc0 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
14dd0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
14de0 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
14df0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
14e00 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
14e10 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
14e20 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
14e30 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
14e40 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
14e50 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
14e60 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
14e70 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
14e80 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
14e90 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
14ea0 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
14eb0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
14ec0 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
14ed0 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
14ee0 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
14ef0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14f00 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
14f10 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
14f20 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
14f30 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
14f40 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
14f50 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
14f60 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
14f70 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
14f80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
14f90 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
14fa0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
14fb0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
14fc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
14fd0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
14fe0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
14ff0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
15000 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
15010 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
15020 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15030 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
15040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15050 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
15060 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
15070 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
15080 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
15090 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
150a0 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
150b0 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
150c0 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
150d0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
150e0 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
150f0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
15100 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
15110 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
15120 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
15130 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
15140 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
15150 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
15160 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
15170 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
15180 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
15190 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
151a0 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
151b0 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
151c0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
151d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
151e0 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
151f0 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
15200 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
15210 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
15220 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
15230 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
15240 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
15250 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
15260 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
15270 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
15280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15290 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
152a0 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
152b0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
152c0 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
152d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
152e0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
152f0 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
15300 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
15310 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
15320 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15330 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15340 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
15350 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
15360 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
15370 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
15380 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
15390 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
153a0 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
153b0 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
153c0 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
153d0 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
153e0 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
153f0 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
15400 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
15410 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
15420 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
15430 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
15440 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
15450 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
15460 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
15470 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15480 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
15490 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
154a0 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
154b0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
154c0 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
154d0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
154e0 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
154f0 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
15500 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
15510 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
15520 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
15530 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
15540 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
15550 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
15560 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
15570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15580 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
15590 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
155a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
155b0 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
155c0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
155d0 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
155e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
155f0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
15600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
15610 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
15620 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
15630 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
15660 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
15670 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
15680 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
15690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
156a0 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
156b0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
156c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
156d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
156e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
156f0 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
15700 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
15710 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
15720 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
15730 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
15740 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
15750 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15760 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
15770 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
15780 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
15790 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
157a0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
157b0 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
157c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
157d0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
157e0 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
157f0 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
15800 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15810 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
15820 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
15830 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15840 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
15850 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
15860 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
15870 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
15880 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
15890 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
158b0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
158c0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
158d0 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
158e0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
158f0 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
15900 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
15910 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
15920 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
15930 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
15940 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
15950 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
15960 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
15970 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
15980 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15990 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
159a0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
159b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
159c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
159d0 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
159e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
159f0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
15a00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
15a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
15a40 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
15a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15a60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
15a70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
15a80 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
15a90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
15aa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15ac0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15ad0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15ae0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15af0 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
15b00 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
15b10 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
15b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
15b30 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
15b40 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
15b50 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
15b60 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
15b70 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
15b80 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
15b90 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
15ba0 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
15bb0 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
15bc0 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
15bd0 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
15be0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15bf0 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
15c00 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
15c10 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
15c20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15c30 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
15c40 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
15c50 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
15c60 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
15c70 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
15c80 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
15c90 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
15ca0 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
15cb0 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
15cc0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
15cd0 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
15ce0 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
15cf0 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
15d00 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
15d10 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
15d20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
15d30 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
15d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15d50 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
15d60 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15d70 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
15d80 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15d90 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
15da0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
15db0 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
15dc0 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
15dd0 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
15de0 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
15df0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
15e00 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
15e10 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
15e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15e30 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
15e40 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
15e50 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
15e60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
15e70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
15e80 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
15e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
15eb0 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61  of(MemPage), fla
15ec0 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
15ed0 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
15ee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15ef0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15f00 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
15f10 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
15f20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
15f30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15f40 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
15f50 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
15f60 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
15f70 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
15f80 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
15f90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15fa0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
15fb0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
15fc0 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
15fd0 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
15fe0 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
15ff0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
16000 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  etBusyHandler(pB
16010 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
16020 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
16030 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
16040 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
16050 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
16060 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
16070 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
16080 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
16090 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
160a0 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
160b0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
160c0 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e  _ONLY;.#if defin
160d0 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ed(SQLITE_SECURE
160e0 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
160f0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16100 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
16110 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
16120 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52  QLITE_FAST_SECUR
16130 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42  E_DELETE).    pB
16140 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16150 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65  TS_OVERWRITE;.#e
16160 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44  ndif.    /* EVID
16170 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
16180 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
16190 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
161a0 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
161b0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
161c0 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
161d0 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
161e0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
161f0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
16200 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16210 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16220 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d  ile. */.    pBt-
16230 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
16240 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
16250 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
16260 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
16270 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
16280 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
16290 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
162a0 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
162b0 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
162c0 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
162d0 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
162e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
162f0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
16300 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16310 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
16320 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
16330 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
16340 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
16350 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
16360 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
16370 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
16380 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
16390 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
163a0 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
163b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
163c0 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
163d0 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
163e0 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
163f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
16400 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
16410 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
16420 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
16430 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
16440 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
16450 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
16460 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
16470 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
16480 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16490 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
164a0 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
164b0 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
164c0 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
164d0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
164e0 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
164f0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
16500 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
16510 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
16520 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
16530 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
16540 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
16550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16560 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
16570 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
16580 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
16590 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
165a0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74   is.      ** det
165b0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
165c0 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
165d0 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
165e0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
165f0 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  0.      ** into 
16600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16610 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
16620 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
16630 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
16640 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
16650 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
16660 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
16670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16680 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
16690 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
166a0 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
166b0 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
166c0 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
166d0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
166e0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
166f0 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
16700 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
16710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16720 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
16730 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
16740 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
16750 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
16760 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
16770 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
16780 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
16790 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
167a0 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
167b0 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
167c0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
167d0 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
167e0 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
167f0 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
16800 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16810 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
16820 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
16830 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
16840 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
16850 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
16860 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
16870 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
16880 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
16890 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d  .    pBt->nRef =
168a0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   1;.    if( p->s
168b0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
168c0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
168d0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
168e0 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
168f0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
16900 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
16910 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16920 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
16930 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
16940 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
16950 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
16960 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16970 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
16980 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
16990 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
169a0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
169b0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
169c0 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
169d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
169e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
169f0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
16a00 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
16a10 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
16a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16a30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16a40 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
16a50 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
16a60 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
16a70 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
16a80 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
16a90 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
16aa0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
16ab0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
16ac0 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
16ad0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
16ae0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
16af0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
16b00 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
16b10 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
16b20 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
16b30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
16b40 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
16b50 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
16b60 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
16b70 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
16b80 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
16b90 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
16ba0 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
16bb0 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
16bc0 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
16bd0 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
16be0 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
16bf0 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
16c00 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
16c10 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
16c20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
16c30 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
16c40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
16c50 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
16c60 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
16c70 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
16c80 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
16c90 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
16ca0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
16cb0 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
16cc0 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
16cd0 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d      if( (uptr)p-
16ce0 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d  >pBt<(uptr)pSib-
16cf0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
16d00 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
16d10 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
16d20 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
16d30 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
16d40 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
16d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
16d60 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
16d70 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d  t && (uptr)pSib-
16d80 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74  >pNext->pBt<(upt
16d90 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  r)p->pBt ){.    
16da0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
16db0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
16dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16dd0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
16de0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
16df0 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
16e00 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
16e10 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
16e20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
16e30 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
16e40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16e50 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
16e60 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
16e70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e90 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
16ea0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
16eb0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
16ec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16ed0 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
16ee0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
16ef0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
16f00 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
16f10 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
16f20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16f30 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
16f40 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
16f50 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
16f60 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
16f70 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20  _file *pFile;.. 
16f80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
16f90 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
16fa0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
16fb0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
16fc0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
16fd0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
16fe0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
16ff0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
17000 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
17010 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
17020 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
17030 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
17040 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
17050 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
17060 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
17070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
17080 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
17090 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
170a0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
170b0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
170c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69  ;.    }..    pFi
170d0 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
170e0 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
170f0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  r);.    if( pFil
17100 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  e->pMethods ){. 
17110 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
17120 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46  leControlHint(pF
17130 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ile, SQLITE_FCNT
17140 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70  L_PDB, (void*)&p
17150 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  Bt->db);.    }. 
17160 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
17170 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
17180 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17190 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
171a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
171b0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
171c0 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Open);.  }.  ass
171d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
171e0 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  OK || sqlite3Btr
171f0 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e  eeConnectionCoun
17200 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b  t(*ppBtree)>0 );
17210 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17220 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
17230 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
17240 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
17250 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
17260 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
17270 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
17280 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
17290 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
172a0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
172b0 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
172c0 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
172d0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
172e0 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
172f0 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
17300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17310 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
17320 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
17330 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
17340 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
17350 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c  _CACHE.  MUTEX_L
17360 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
17370 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a  tex *pMaster; ).
17380 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
17390 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
173a0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
173b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
173c0 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
173d0 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  x) );.  MUTEX_LO
173e0 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
173f0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
17400 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
17410 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
17420 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17430 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
17440 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
17450 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
17460 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
17470 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
17480 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
17490 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
174a0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
174b0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
174c0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
174d0 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
174e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
174f0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
17500 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
17510 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
17520 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
17530 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
17540 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
17550 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
17560 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
17570 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
17580 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
17590 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
175a0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
175b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
175c0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
175d0 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
175e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
175f0 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
17600 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
17610 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
17620 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17630 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
17640 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
17650 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
17660 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
17670 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
17680 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
17690 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
176a0 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
176b0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
176c0 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65  es with a 4-byte
176d0 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65   prefix for a le
176e0 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e  ft-child.** poin
176f0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
17700 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
17710 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
17720 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
17730 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
17740 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
17750 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
17760 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
17770 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
17780 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20  One of the uses 
17790 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  of pBt->pTmpSpac
177a0 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63  e is to format c
177b0 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20  ells before.    
177c0 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  ** inserting the
177d0 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61  m into a leaf pa
177e0 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c  ge (function fil
177f0 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20  lInCell()). If. 
17800 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20     ** a cell is 
17810 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65  less than 4 byte
17820 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73  s in size, it is
17830 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
17840 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79   bytes.    ** by
17850 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75   the various rou
17860 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70  tines that manip
17870 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c  ulate binary cel
17880 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a  ls. Which.    **
17890 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66   can mean that f
178a0 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79  illInCell() only
178b0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
178c0 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20   first 2 or 3.  
178d0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54    ** bytes of pT
178e0 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61  mpSpace, but tha
178f0 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  t the first 4 by
17900 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66  tes are copied f
17910 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e  rom.    ** it in
17920 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61  to a database pa
17930 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ge. This is not 
17940 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c  actually a probl
17950 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a  em, but it.    *
17960 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76  * does cause a v
17970 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68  algrind error wh
17980 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79  en the 1 or 2 by
17990 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a  tes of unitializ
179a0 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ed .    ** data 
179b0 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73  is passed to sys
179c0 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29  tem call write()
179d0 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68  . So to avoid th
179e0 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a  is error,.    **
179f0 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
17a00 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20  4 bytes of temp 
17a10 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20  space here..    
17a20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20  **.    ** Also: 
17a30 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79   Provide four by
17a40 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  tes of initializ
17a50 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ed space before 
17a60 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e  the.    ** begin
17a70 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63  ning of pTmpSpac
17a80 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61  e as an area ava
17a90 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e  ilable to prepen
17aa0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66  d the.    ** lef
17ab0 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
17ac0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
17ad0 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20   of a cell..    
17ae0 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
17af0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
17b00 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70     memset(pBt->p
17b10 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b  TmpSpace, 0, 8);
17b20 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  .      pBt->pTmp
17b30 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20  Space += 4;.    
17b40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
17b50 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
17b60 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
17b70 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
17b80 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
17b90 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
17ba0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
17bb0 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
17bc0 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a  pTmpSpace -= 4;.
17bd0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
17be0 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  ree(pBt->pTmpSpa
17bf0 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54  ce);.    pBt->pT
17c00 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d  mpSpace = 0;.  }
17c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
17c20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
17c30 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
17c40 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
17c50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17c60 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
17c70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17c80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
17c90 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
17ca0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
17cb0 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
17cc0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
17cd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17ce0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17cf0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
17d00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17d10 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20  er(p);.  pCur = 
17d20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
17d30 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
17d40 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
17d50 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
17d60 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
17d70 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
17d80 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
17d90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
17da0 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
17db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17dc0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
17dd0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
17de0 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
17df0 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
17e00 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
17e10 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
17e20 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
17e30 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
17e40 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
17e50 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
17e60 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
17e70 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f  back(p, SQLITE_O
17e80 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
17e90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
17ea0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
17eb0 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
17ec0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
17ed0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
17ee0 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
17ef0 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
17f00 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
17f10 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
17f20 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
17f30 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
17f40 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
17f50 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
17f60 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
17f70 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
17f80 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
17f90 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
17fa0 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
17fb0 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
17fc0 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
17fd0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
17fe0 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
17ff0 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
18000 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
18010 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
18020 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
18030 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
18040 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
18050 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
18060 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
18070 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
18080 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
18090 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
180a0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
180b0 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
180c0 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
180d0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
180e0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
180f0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
18100 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
18110 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
18120 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
18130 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
18140 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
18150 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
18160 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
18170 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
18180 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
18190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
181a0 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
181b0 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
181c0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
181d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
181e0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
181f0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
18200 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
18210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
18220 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18230 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
18240 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20  ange the "soft" 
18250 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
18260 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18270 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e  the cache..** Un
18280 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66  used and unmodif
18290 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62  ied pages will b
182a0 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20  e recycled when 
182b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
182c0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
182d0 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73  che exceeds this
182e0 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75   soft limit.  Bu
182f0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
18300 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c  e.** cache is al
18310 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61  lowed to grow la
18320 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c  rger than this l
18330 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61  imit if it conta
18340 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  ins.** dirty pag
18350 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c  es or pages stil
18360 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e  l in active use.
18370 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18380 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
18390 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
183a0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
183b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
183c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
183d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
183e0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
183f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18400 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
18410 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
18420 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
18430 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
18440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18460 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
18470 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22  ange the "spill"
18480 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
18490 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
184a0 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49   the cache..** I
184b0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
184c0 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68  pages exceeds th
184d0 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20  is limit during 
184e0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
184f0 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ion,.** the page
18500 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  r might attempt 
18510 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73  to "spill" pages
18520 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
18530 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65  early in.** orde
18540 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
18550 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ory..**.** The v
18560 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
18570 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69   the current spi
18580 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72  ll size.  If zer
18590 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61  o is passed.** a
185a0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e  s an argument, n
185b0 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
185c0 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20  de to the spill 
185d0 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f  size setting, so
185e0 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65  .** using mxPage
185f0 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74   of 0 is a way t
18600 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72  o query the curr
18610 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a  ent spill size..
18620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18630 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
18640 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
18650 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
18660 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
18670 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
18680 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18690 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
186a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
186b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
186c0 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
186d0 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
186e0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
186f0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
18700 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18710 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
18720 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
18730 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
18740 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
18750 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
18760 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
18770 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
18780 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
18790 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
187a0 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
187b0 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
187c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
187d0 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
187e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
187f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18800 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
18810 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18820 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18830 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
18840 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
18850 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
18860 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
18870 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18890 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
188a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
188b0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
188c0 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
188d0 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
188e0 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
188f0 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
18900 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
18910 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
18920 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
18930 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
18940 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
18950 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
18960 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
18970 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
18980 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
18990 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
189a0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
189b0 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
189c0 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
189d0 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
189e0 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
189f0 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
18a00 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
18a10 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
18a20 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
18a30 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
18a40 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
18a50 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
18a60 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
18a70 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
18a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
18a90 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
18aa0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
18ab0 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
18ac0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18ad0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
18ae0 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
18af0 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
18b00 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
18b10 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
18b20 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
18b30 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
18b40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18b50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18b60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
18b70 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
18b80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18b90 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
18ba0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
18bb0 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
18bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18bd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18be0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18bf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
18c00 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
18c10 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
18c20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18c30 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
18c40 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
18c50 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
18c60 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18c70 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
18c80 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
18c90 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
18ca0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
18cb0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
18cc0 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
18cd0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
18ce0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
18cf0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
18d00 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
18d10 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
18d20 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
18d30 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
18d40 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
18d50 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
18d60 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
18d70 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
18d80 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
18d90 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
18da0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18db0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
18dc0 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
18dd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
18de0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
18df0 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
18e00 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
18e10 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
18e20 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
18e30 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
18e40 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
18e50 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
18e60 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
18e70 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
18e80 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
18e90 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
18ea0 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
18eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
18ec0 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
18ed0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
18ee0 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
18ef0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
18f00 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
18f10 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
18f20 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
18f30 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
18f40 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
18f50 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
18f60 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
18f70 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
18f80 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
18f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
18fa0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18fb0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
18fc0 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
18fd0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
18fe0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18ff0 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
19000 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
19010 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
19020 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
19030 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
19040 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
19050 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
19060 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
19070 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
19080 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
19090 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
190a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
190b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
190c0 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
190d0 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
190e0 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
190f0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
19100 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
19110 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
19120 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
19130 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
19140 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
19150 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
19160 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
19170 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
19180 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
19190 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
191a0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
191b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
191c0 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
191d0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
191e0 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
191f0 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
19200 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
19210 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19220 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
19230 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
19240 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
19250 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
19260 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
19270 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
19280 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
19290 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
192a0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
192b0 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
192c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
192d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
192e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
192f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
19300 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
19310 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
19320 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
19330 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
19340 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
19350 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
19360 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19370 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
19380 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
19390 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
193a0 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
193b0 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
193c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
193d0 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
193e0 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
193f0 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
19400 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
19410 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
19420 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
19430 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
19440 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
19450 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
19460 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
19470 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
19480 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
19490 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
194a0 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
194b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
194c0 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
194d0 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
194e0 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
194f0 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
19500 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
19510 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
19520 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19530 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
19540 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
19550 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
19560 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
19570 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
19580 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19590 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
195a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
195b0 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
195c0 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
195d0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
195e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
195f0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
19600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19610 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19620 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
19630 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
19640 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
19650 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
19660 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
19670 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
19680 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
19690 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
196a0 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
196b0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
196c0 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
196d0 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
196e0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
196f0 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
19700 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
19710 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
19720 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
19730 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
19740 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
19750 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
19760 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
19770 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
19780 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19790 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
197a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
197b0 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
197c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
197d0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
197e0 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
197f0 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
19800 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
19810 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
19820 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19830 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
19840 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
19850 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
19860 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
19870 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
19880 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
19890 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
198a0 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
198b0 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
198c0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
198d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
198e0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
198f0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
19900 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
19910 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
19920 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
19930 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
19940 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
19950 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
19960 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
19970 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
19980 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
19990 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
199a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
199b0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
199c0 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
199d0 65 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53  es for the BTS_S
199e0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
199f0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66   BTS_OVERWRITE f
19a00 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e  lags:.**.**    n
19a10 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20  ewFlag==0       
19a20 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f  Both BTS_SECURE_
19a30 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f  DELETE and BTS_O
19a40 56 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65  VERWRITE are cle
19a50 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
19a60 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f  ag==1       BTS_
19a70 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65  SECURE_DELETE se
19a80 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  t and BTS_OVERWR
19a90 49 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a  ITE is cleared.*
19aa0 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20  *    newFlag==2 
19ab0 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45        BTS_SECURE
19ac0 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20  _DELETE cleared 
19ad0 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
19ae0 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e  E is set.**    n
19af0 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20  ewFlag==(-1)    
19b00 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a  No changes.**.**
19b10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
19b20 74 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66  ts as a query if
19b30 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73   newFlag is less
19b40 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a   than zero.**.**
19b50 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52   With BTS_OVERWR
19b60 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64  ITE set, deleted
19b70 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72   content is over
19b80 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73  written by zeros
19b90 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73  , but.** freelis
19ba0 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65  t leaf pages are
19bb0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63   not written bac
19bc0 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
19bd0 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65  e.  Thus in-page
19be0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  .** deleted cont
19bf0 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ent is cleared, 
19c00 62 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c  but freelist del
19c10 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
19c20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  not..**.** With 
19c30 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
19c40 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  E, operation is 
19c50 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49  like BTS_OVERWRI
19c60 54 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69  TE with the addi
19c70 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65  tion.** that fre
19c80 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  elist leaf pages
19c90 20 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63   are written bac
19ca0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
19cb0 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a  ase, increasing.
19cc0 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ** the amount of
19cd0 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e   disk I/O..*/.in
19ce0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
19cf0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
19d00 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
19d10 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
19d20 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
19d30 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
19d40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
19d50 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49  ert( BTS_OVERWRI
19d60 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44  TE==BTS_SECURE_D
19d70 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73  ELETE*2 );.  ass
19d80 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45  ert( BTS_FAST_SE
19d90 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57  CURE==(BTS_OVERW
19da0 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f  RITE|BTS_SECURE_
19db0 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28  DELETE) );.  if(
19dc0 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
19dd0 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
19de0 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54  ags &= ~BTS_FAST
19df0 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e  _SECURE;.    p->
19e00 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
19e10 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
19e20 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a  TE*newFlag;.  }.
19e30 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
19e40 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41  tsFlags & BTS_FA
19e50 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53  ST_SECURE)/BTS_S
19e60 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
19e70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19e80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
19e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
19ea0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
19eb0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
19ec0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
19ed0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
19ee0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
19ef0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
19f00 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
19f10 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
19f20 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
19f30 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
19f40 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
19f50 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
19f60 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
19f70 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
19f80 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
19f90 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
19fa0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
19fb0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
19fc0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
19fd0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
19fe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19ff0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
1a000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
1a010 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
1a020 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1a030 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1a040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1a050 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
1a060 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
1a070 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1a080 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1a090 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
1a0a0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
1a0b0 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
1a0c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1a0d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1a0e0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
1a0f0 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
1a100 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
1a110 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
1a120 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
1a130 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1a140 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a150 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1a160 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
1a170 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
1a180 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
1a190 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
1a1a0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
1a1b0 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
1a1c0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1a1d0 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
1a1e0 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
1a1f0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1a200 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1a210 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1a220 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
1a230 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
1a240 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
1a250 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a260 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
1a270 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
1a280 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
1a290 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
1a2a0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
1a2b0 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
1a2c0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
1a2d0 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
1a2e0 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
1a2f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a300 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a310 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
1a320 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  ./*.** If the us
1a330 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74  er has not set t
1a340 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
1a350 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
1a360 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
1a370 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79  using "PRAGMA sy
1a380 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20  nchronous", and 
1a390 69 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65  if the safety-le
1a3a0 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  vel is not alrea
1a3b0 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  dy.** set to the
1a3c0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
1a3d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1a3e0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
1a3f0 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69  ameter,.** set i
1a400 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  t so..*/.#if SQL
1a410 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
1a420 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f  HRONOUS!=SQLITE_
1a430 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
1a440 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26  HRONOUS \.    &&
1a450 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a460 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69  _OMIT_WAL).stati
1a470 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c  c void setDefaul
1a480 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72  tSyncFlag(BtShar
1a490 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65  ed *pBt, u8 safe
1a4a0 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c  ty_level){.  sql
1a4b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
1a4c0 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70  pDb;.  if( (db=p
1a4d0 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
1a4e0 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
1a4f0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  {.    while( pDb
1a500 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d  ->pBt==0 || pDb-
1a510 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29  >pBt->pBt!=pBt )
1a520 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69  { pDb++; }.    i
1a530 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74  f( pDb->bSyncSet
1a540 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62  ==0 .     && pDb
1a550 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ->safety_level!=
1a560 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20  safety_level .  
1a570 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e     && pDb!=&db->
1a580 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20  aDb[1] .    ){. 
1a590 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
1a5a0 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f  _level = safety_
1a5b0 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c  level;.      sql
1a5c0 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
1a5d0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20  s(pBt->pPager,. 
1a5e0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
1a5f0 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
1a600 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
1a610 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
1a620 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
1a630 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61  # define setDefa
1a640 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
1a650 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65  safety_level).#e
1a660 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ndif../*.** Get 
1a670 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
1a680 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
1a690 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
1a6a0 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
1a6b0 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
1a6c0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
1a6d0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1a6e0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1a6f0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
1a700 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
1a710 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
1a720 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
1a730 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1a740 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
1a750 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1a760 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
1a770 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
1a780 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
1a790 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
1a7a0 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
1a7b0 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
1a7c0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
1a7d0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
1a7e0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1a7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1a800 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
1a810 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
1a820 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
1a830 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
1a840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a850 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
1a860 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1a870 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1a880 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1a890 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
1a8a0 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
1a8b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1a8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a8d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
1a8e0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
1a8f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1a900 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1a910 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
1a920 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1a930 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a940 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1a950 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
1a960 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
1a970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1a980 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
1a990 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
1a9a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1a9b0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
1a9c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1a9d0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
1a9e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a9f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1aa00 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
1aa10 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
1aa20 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
1aa30 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
1aa40 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
1aa50 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
1aa60 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
1aa70 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
1aa80 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
1aa90 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
1aaa0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
1aab0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1aac0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
1aad0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
1aae0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
1aaf0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
1ab00 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
1ab10 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
1ab20 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
1ab30 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
1ab40 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
1ab50 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
1ab60 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
1ab70 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
1ab80 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
1ab90 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
1aba0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
1abb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1abc0 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
1abd0 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
1abe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
1abf0 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
1ac00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
1ac10 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
1ac20 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
1ac30 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
1ac40 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
1ac50 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
1ac60 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
1ac70 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
1ac80 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
1ac90 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1aca0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
1acb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1acc0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
1acd0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
1ace0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1acf0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
1ad00 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
1ad10 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
1ad20 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1ad30 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1ad40 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
1ad50 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
1ad60 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
1ad70 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
1ad80 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
1ad90 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
1ada0 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
1adb0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1adc0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
1add0 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
1ade0 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
1adf0 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
1ae00 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
1ae10 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
1ae20 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
1ae30 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
1ae40 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
1ae50 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
1ae60 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
1ae70 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
1ae80 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
1ae90 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
1aea0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
1aeb0 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
1aec0 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
1aed0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
1aee0 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
1aef0 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
1af00 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
1af10 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
1af20 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
1af30 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
1af40 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
1af50 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
1af60 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
1af70 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
1af80 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
1af90 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
1afa0 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
1afb0 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
1afc0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
1afd0 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
1afe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1aff0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
1b000 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
1b010 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
1b020 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b030 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
1b040 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1b050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b060 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
1b070 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
1b080 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
1b090 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
1b0a0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
1b0b0 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
1b0c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1b0d0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
1b0e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b0f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
1b100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1b110 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
1b120 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  B;.    }else{.  
1b130 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
1b140 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
1b150 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
1b160 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d  RONOUS+1);.    }
1b170 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1b180 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1b190 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
1b1a0 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
1b1b0 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
1b1c0 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
1b1d0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
1b1e0 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
1b1f0 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
1b200 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
1b210 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b220 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
1b230 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
1b240 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
1b250 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
1b260 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
1b270 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
1b280 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
1b290 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
1b2a0 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
1b2b0 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
1b2c0 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
1b2d0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1b2e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1b2f0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b300 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
1b310 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
1b320 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
1b330 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
1b340 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
1b350 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
1b360 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
1b370 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
1b380 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
1b390 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
1b3a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1b3b0 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
1b3c0 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
1b3d0 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
1b3e0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
1b3f0 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
1b400 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
1b410 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
1b420 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
1b430 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
1b440 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
1b450 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
1b460 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
1b470 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
1b480 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
1b490 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
1b4a0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
1b4b0 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
1b4c0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1b4d0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1b4e0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
1b4f0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
1b500 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1b510 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
1b520 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
1b530 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
1b540 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
1b550 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
1b560 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
1b570 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1b580 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
1b590 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
1b5a0 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
1b5b0 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
1b5c0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
1b5d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1b5e0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
1b5f0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
1b600 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
1b610 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
1b620 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
1b630 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
1b640 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
1b650 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
1b660 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1b670 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
1b680 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
1b690 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
1b6a0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
1b6b0 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
1b6c0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
1b6d0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
1b6e0 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
1b6f0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1b700 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
1b710 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
1b720 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
1b730 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
1b740 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
1b750 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1b760 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
1b770 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
1b780 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1b790 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
1b7a0 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
1b7b0 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
1b7c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
1b7d0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
1b7e0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1b7f0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
1b800 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1b810 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
1b820 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
1b830 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1b840 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
1b850 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1b860 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
1b870 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1b880 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
1b890 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1b8a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1b8b0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1b8c0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1b8d0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1b8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
1b910 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
1b920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b930 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
1b940 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1b950 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
1b960 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
1b970 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
1b980 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1b990 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1b9a0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1b9b0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1b9c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b9d0 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
1b9e0 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
1b9f0 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
1ba00 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
1ba10 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
1ba20 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
1ba30 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
1ba40 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
1ba50 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
1ba60 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
1ba70 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
1ba80 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
1ba90 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
1baa0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1bab0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1bac0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
1bad0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1bae0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
1baf0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1bb00 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1bb10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1bb20 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
1bb30 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1bb40 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
1bb50 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
1bb60 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
1bb70 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1bb80 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
1bb90 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1bba0 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
1bbb0 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1bbc0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
1bbd0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
1bbe0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
1bbf0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
1bc00 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
1bc10 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
1bc20 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
1bc30 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
1bc40 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
1bc50 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
1bc60 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
1bc70 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
1bc80 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
1bc90 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
1bca0 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
1bcb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
1bcc0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
1bcd0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
1bce0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
1bcf0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
1bd00 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
1bd10 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1bd20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
1bd30 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
1bd40 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
1bd50 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
1bd60 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
1bd70 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
1bd80 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
1bd90 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
1bda0 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
1bdb0 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
1bdc0 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
1bdd0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
1bde0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
1bdf0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
1be00 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1be10 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
1be20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
1be30 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
1be40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1be50 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1be60 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
1be70 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
1be80 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
1be90 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
1bea0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1beb0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1bec0 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
1bed0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
1bee0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
1bef0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1bf00 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
1bf10 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1bf20 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
1bf30 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
1bf40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
1bf50 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
1bf60 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
1bf70 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
1bf80 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
1bf90 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1bfa0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1bfb0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
1bfc0 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
1bfd0 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1bfe0 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1bff0 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1c000 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1c010 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1c020 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1c030 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1c040 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1c050 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1c060 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1c070 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1c080 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1c090 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1c0a0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1c0b0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1c0c0 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1c0d0 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1c0e0 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1c0f0 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1c100 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1c110 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1c120 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1c130 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1c140 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1c150 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1c160 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1c170 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1c180 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1c190 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1c1a0 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1c1b0 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1c1c0 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1c1d0 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1c1e0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1c1f0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1c200 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1c210 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1c220 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1c230 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1c240 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1c250 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1c260 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1c270 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1c280 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1c290 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1c2a0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1c2b0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1c2c0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1c2d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1c2e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c2f0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1c300 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1c310 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1c320 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1c330 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1c340 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1c350 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1c360 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1c370 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1c380 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1c390 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1c3a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1c3b0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1c3c0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1c3d0 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1c3e0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1c3f0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1c400 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1c410 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c420 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1c430 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1c440 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1c450 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1c460 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1c470 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1c480 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1c490 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1c4a0 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1c4b0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1c4c0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1c4d0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1c4e0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1c4f0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1c500 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1c510 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1c520 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1c530 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c540 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1c550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c560 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1c570 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1c580 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1c590 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1c5a0 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1c5b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1c5c0 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
1c5d0 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
1c5e0 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
1c5f0 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
1c600 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
1c610 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
1c620 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
1c630 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
1c640 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1c650 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
1c660 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
1c670 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
1c680 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
1c690 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
1c6a0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1c6b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c6c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c6d0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
1c6e0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
1c6f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c700 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
1c710 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
1c720 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
1c730 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
1c740 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1c750 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
1c760 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1c770 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1c780 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
1c790 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
1c7a0 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1c7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
1c7c0 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1c7d0 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
1c7e0 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
1c7f0 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
1c800 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
1c810 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1c820 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
1c830 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
1c840 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
1c850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1c860 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
1c870 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
1c880 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
1c890 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
1c8a0 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
1c8b0 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
1c8c0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
1c8d0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
1c8e0 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
1c8f0 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
1c900 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
1c910 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
1c920 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
1c930 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
1c940 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
1c950 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
1c960 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1c970 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1c980 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
1c990 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c9a0 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
1c9b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
1c9c0 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
1c9d0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
1c9e0 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
1c9f0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
1ca00 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
1ca10 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
1ca20 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
1ca30 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1ca40 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1ca50 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
1ca60 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
1ca70 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
1ca80 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
1ca90 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1caa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1cab0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1cac0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1cad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cae0 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
1caf0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
1cb00 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1cb10 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
1cb20 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
1cb30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1cb40 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1cb50 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1cb60 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1cb70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1cb80 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
1cb90 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1cba0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1cbb0 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
1cbc0 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1cbd0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1cbe0 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
1cbf0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1cc00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1cc10 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1cc20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
1cc30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
1cc40 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
1cc50 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
1cc60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1cc70 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1cc80 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1cc90 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1cca0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1ccb0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1ccc0 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1ccd0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1cce0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1ccf0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1cd00 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1cd10 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1cd20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1cd30 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1cd40 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1cd50 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1cd60 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1cd70 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1cd80 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1cd90 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1cda0 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1cdb0 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1cdc0 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1cdd0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1cde0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1cdf0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1ce00 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1ce10 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1ce20 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1ce30 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1ce40 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1ce50 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1ce60 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1ce70 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1ce80 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1ce90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1cea0 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1ceb0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1cec0 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1ced0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1cee0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1cef0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1cf00 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1cf10 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1cf20 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1cf30 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1cf40 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1cf50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1cf60 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1cf70 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1cf80 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1cf90 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1cfa0 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1cfb0 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1cfc0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1cfd0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1cfe0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1cff0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1d000 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1d010 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1d020 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1d030 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1d040 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1d050 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1d060 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1d070 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1d080 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1d090 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1d0a0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1d0b0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1d0c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1d0d0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1d0e0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1d0f0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1d100 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1d110 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1d120 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1d130 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1d140 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1d150 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1d160 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1d170 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1d180 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1d190 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1d1a0 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1d1b0 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1d1c0 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1d1d0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1d1e0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1d1f0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1d200 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1d210 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1d220 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1d230 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1d240 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1d250 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1d260 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1d270 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1d280 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1d290 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1d2a0 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1d2b0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1d2c0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1d2d0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
1d2e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1d2f0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1d300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1d310 74 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20  t bConcurrent = 
1d320 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63 75 72 72  (p->db->bConcurr
1d330 65 6e 74 20 26 26 20 21 49 53 41 55 54 4f 56 41  ent && !ISAUTOVA
1d340 43 55 55 4d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  CUUM);..  sqlite
1d350 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1d360 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1d370 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1d380 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
1d390 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
1d3a0 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
1d3b0 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
1d3c0 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
1d3d0 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
1d3e0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
1d3f0 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
1d400 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
1d410 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1d420 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1d430 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
1d440 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
1d450 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
1d460 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1d470 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gun;.  }.  asser
1d480 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1d490 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1d4a0 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41  TE || IfNotOmitA
1d4b0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
1d4c0 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  te)==0 );..  /* 
1d4d0 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
1d4e0 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
1d4f0 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
1d500 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
1d510 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1d520 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1d530 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61  NLY)!=0 && wrfla
1d540 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
1d550 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1d560 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1d570 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
1d580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1d590 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20  ARED_CACHE.  {. 
1d5a0 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f     sqlite3 *pBlo
1d5b0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49  ck = 0;.    /* I
1d5c0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
1d5d0 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
1d5e0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
1d5f0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1d600 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73   .    ** on this
1d610 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
1d620 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
1d630 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
1d640 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  action is.    **
1d650 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
1d660 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
1d670 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d680 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
1d690 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1d6a0 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20  TRANS_WRITE).   
1d6b0 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c    || (pBt->btsFl
1d6c0 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
1d6d0 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  G)!=0.    ){.   
1d6e0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
1d6f0 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
1d700 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
1d710 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74  ag>1 ){.      Bt
1d720 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
1d730 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
1d740 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1d750 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1d760 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
1d770 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1d780 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  p ){.          p
1d790 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
1d7a0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
1d7b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d7d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f    }.    if( pBlo
1d7e0 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
1d7f0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
1d800 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
1d810 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ck);.      rc = 
1d820 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
1d830 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20  AREDCACHE;.     
1d840 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1d850 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
1d860 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
1d870 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
1d880 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1d890 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
1d8a0 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
1d8b0 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
1d8c0 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
1d8d0 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
1d8e0 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
1d8f0 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
1d900 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
1d910 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
1d920 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
1d930 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
1d940 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
1d950 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
1d960 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
1d970 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
1d980 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1d990 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1d9a0 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c   &= ~BTS_INITIAL
1d9b0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20  LY_EMPTY;.  if( 
1d9c0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20  pBt->nPage==0 ) 
1d9d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1d9e0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1d9f0 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  MPTY;.  do {.   
1da00 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
1da10 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
1da20 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
1da30 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
1da40 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
1da50 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
1da60 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
1da70 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
1da80 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
1da90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1daa0 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
1dab0 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
1dac0 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
1dad0 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
1dae0 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
1daf0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1db00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
1db10 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
1db20 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
1db30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
1db40 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
1db50 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
1db60 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
1db70 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1db80 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1db90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
1dba0 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
1dbb0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
1dbc0 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
1dbd0 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
1dbe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dbf0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1dc00 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74      if( (pBt->bt
1dc10 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1dc20 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  D_ONLY)!=0 ){.  
1dc30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dc40 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1dc50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dc60 20 69 6e 74 20 65 78 46 6c 61 67 20 3d 20 62 43   int exFlag = bC
1dc70 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31 20 3a  oncurrent ? -1 :
1dc80 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20   (wrflag>1);.   
1dc90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1dca0 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
1dcb0 3e 70 50 61 67 65 72 2c 20 65 78 46 6c 61 67 2c  >pPager, exFlag,
1dcc0 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
1dcd0 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
1dce0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1dcf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dd00 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1dd10 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1dd20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1dd30 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1dd40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dd50 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1dd60 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1dd70 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1dd80 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1dd90 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1dda0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1ddb0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1ddc0 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1ddd0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1dde0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
1ddf0 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65  gerResetLockTime
1de00 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  out(pBt->pPager)
1de10 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1de20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1de30 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1de40 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1de50 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1de60 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
1de70 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1de80 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
1de90 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
1dea0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1deb0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
1dec0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
1ded0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
1dee0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
1def0 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
1df00 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
1df10 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1df20 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
1df30 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
1df40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1df50 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
1df60 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
1df70 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
1df80 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
1df90 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
1dfa0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
1dfb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
1dfc0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
1dfd0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
1dfe0 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1dff0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e000 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1e010 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
1e020 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1e030 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
1e040 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
1e050 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
1e060 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
1e070 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1e080 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
1e090 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
1e0a0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
1e0b0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
1e0c0 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
1e0d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1e0e0 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
1e0f0 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
1e100 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
1e110 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
1e120 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
1e130 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
1e140 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
1e150 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
1e160 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
1e170 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
1e180 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
1e190 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
1e1a0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
1e1b0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
1e1c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1e1d0 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
1e1e0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
1e1f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
1e200 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
1e210 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1e220 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1e230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1e240 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
1e250 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1e260 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
1e270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e280 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1e290 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1e2a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e2c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e2d0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1e2e0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1e2f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
1e310 6e 73 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65  ns_begun:.#ifnde
1e320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1e330 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 62  NCURRENT.  if( b
1e340 43 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 72 63  Concurrent && rc
1e350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1e360 71 6c 69 74 65 33 50 61 67 65 72 49 73 57 61 6c  qlite3PagerIsWal
1e370 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1e380 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e390 33 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75  3PagerBeginConcu
1e3a0 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  rrent(pBt->pPage
1e3b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
1e3c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1e3d0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  lag ){.      rc 
1e3e0 3d 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c  = btreePtrmapAll
1e3f0 6f 63 61 74 65 28 70 42 74 29 3b 0a 20 20 20 20  ocate(pBt);.    
1e400 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1e410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e420 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1e430 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1e440 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
1e450 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
1e460 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
1e470 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
1e480 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
1e490 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1e4a0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
1e4b0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
1e4c0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1e4d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1e4e0 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1e4f0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1e500 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
1e510 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t nSavepoint = p
1e520 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1e530 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1e540 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1e550 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1e560 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , nSavepoint);. 
1e570 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e580 45 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69  E_OK && nSavepoi
1e590 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1e5a0 20 62 74 72 65 65 50 74 72 6d 61 70 42 65 67 69   btreePtrmapBegi
1e5b0 6e 28 70 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e  n(pBt, nSavepoin
1e5c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
1e5d0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1e5e0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1e5f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1e600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1e610 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e620 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
1e630 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
1e640 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
1e650 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
1e660 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
1e670 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
1e680 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
1e690 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1e6a0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
1e6b0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1e6c0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1e6d0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1e6e0 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
1e6f0 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
1e700 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
1e710 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1e720 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
1e750 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
1e760 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1e770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e780 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
1e790 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
1e7a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e7d0 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
1e7e0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1e7f0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
1e800 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
1e810 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e820 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1e830 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1e840 20 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65   );.  rc = pPage
1e850 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54  ->isInit ? SQLIT
1e860 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74  E_OK : btreeInit
1e870 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
1e880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e890 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e8a0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1e8b0 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
1e8c0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1e8d0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1e8e0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1e8f0 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
1e900 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
1e910 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1e920 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1e930 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1e940 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1e950 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1e960 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1e970 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1e980 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1e990 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1e9a0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1e9b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1e9c0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1e9d0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1e9e0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1e9f0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1ea00 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1ea10 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1ea20 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1ea30 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc);.  }..  retu
1ea40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ea50 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1ea60 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1ea70 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1ea80 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1ea90 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1eaa0 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1eab0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1eac0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1ead0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1eae0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1eaf0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1eb00 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1eb10 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1eb20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1eb30 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1eb40 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1eb70 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1eb80 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1eb90 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1eba0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1ebb0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1ebc0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1ebd0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1ebe0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1ebf0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1ec00 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1ec10 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1ec20 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1ec30 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1ec40 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1ec50 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1ec70 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1ec80 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1ec90 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1eca0 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1ecb0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1ecc0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1ecd0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1ece0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ecf0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1ed00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1ed10 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1ed20 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1ed30 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1ed40 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1ed50 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1ed60 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1ed70 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1ed80 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1ed90 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1eda0 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1edb0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1edc0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1edd0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1ede0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1edf0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1ee00 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
1ee10 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1ee20 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
1ee30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1ee40 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  nt nCell;.    in
1ee50 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20  t rc;..    rc = 
1ee60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20  pPage->isInit ? 
1ee70 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65  SQLITE_OK : btre
1ee80 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1ee90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1eea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1eeb0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1eec0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1eed0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1eee0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1eef0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1ef00 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1ef10 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1ef20 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1ef30 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1ef40 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1ef50 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1ef60 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1ef70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1ef80 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1ef90 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
1efa0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b        if( pCell+
1efb0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61  info.nSize > pPa
1efc0 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1efd0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1efe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1eff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f000 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1f010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f020 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
1f030 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65  om==get4byte(pCe
1f040 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29  ll+info.nSize-4)
1f050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f060 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  put4byte(pCell+i
1f070 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f  nfo.nSize-4, iTo
1f080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1f090 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1f0a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1f0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f0c0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
1f0d0 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
1f0e0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1f0f0 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
1f100 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1f110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f120 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1f130 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
1f140 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
1f150 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1f160 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
1f170 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1f180 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1f190 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
1f1a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f1b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1f1c0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
1f1d0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
1f1e0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1f1f0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1f200 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
1f210 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1f220 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1f230 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
1f240 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1f250 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
1f260 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
1f270 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
1f280 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
1f290 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
1f2a0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
1f2b0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
1f2c0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1f2d0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
1f2e0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1f2f0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1f300 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
1f310 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
1f320 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1f330 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
1f340 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
1f350 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1f360 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
1f370 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
1f380 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
1f390 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
1f3a0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
1f3b0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1f3c0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
1f3d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
1f3e0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
1f3f0 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
1f400 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f420 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
1f430 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
1f440 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1f450 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
1f460 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1f470 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
1f480 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1f490 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
1f4a0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
1f4b0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
1f4c0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
1f4d0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1f4e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1f4f0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
1f500 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1f510 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
1f520 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1f530 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
1f540 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1f550 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1f560 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
1f570 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
1f580 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
1f590 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1f5a0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
1f5b0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1f5c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1f5d0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
1f5e0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1f5f0 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
1f600 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1f610 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1f620 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
1f630 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f640 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1f650 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1f660 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
1f670 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
1f680 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
1f690 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
1f6a0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
1f6b0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
1f6c0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
1f6d0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
1f6e0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
1f6f0 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
1f700 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
1f710 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
1f720 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
1f730 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
1f740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f750 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
1f760 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
1f770 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1f780 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
1f790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f7a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1f7b0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
1f7c0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
1f7d0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
1f7e0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
1f7f0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
1f800 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
1f810 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
1f820 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
1f830 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1f840 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
1f850 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1f860 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
1f870 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
1f880 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
1f890 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
1f8a0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1f8b0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
1f8c0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
1f8d0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
1f8e0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
1f8f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1f900 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1f910 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
1f920 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1f930 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1f940 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
1f950 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1f960 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1f970 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1f980 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1f990 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1f9a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
1f9b0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
1f9c0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1f9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f9e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f9f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1fa00 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
1fa10 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
1fa20 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1fa30 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
1fa40 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1fa50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
1fa60 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
1fa70 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
1fa80 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
1fa90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1faa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1fab0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1fac0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
1fad0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
1fae0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
1faf0 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
1fb00 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
1fb10 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
1fb20 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
1fb30 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
1fb40 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
1fb50 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
1fb60 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1fb70 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
1fb80 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1fb90 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1fba0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
1fbb0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
1fbc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fbd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1fbe0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1fbf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fc00 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
1fc10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1fc20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fc30 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1fc40 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1fc50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1fc60 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1fc70 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
1fc80 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
1fc90 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1fca0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
1fcb0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1fcc0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1fcd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fce0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1fcf0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
1fd00 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
1fd10 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
1fd20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fd30 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1fd40 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
1fd50 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
1fd60 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
1fd70 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1fd80 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
1fd90 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
1fda0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
1fdb0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
1fdc0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
1fdd0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1fde0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
1fdf0 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ful, return.** S
1fe00 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
1fe10 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
1fe20 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
1fe30 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a  re no point in .
1fe40 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
1fe50 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
1fe60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1fe70 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ONE. Or, if an e
1fe80 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1fe90 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68   return some oth
1fea0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  er error code..*
1feb0 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
1fec0 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  ically, this fun
1fed0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1fee0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
1fef0 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
1ff00 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
1ff10 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
1ff20 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1ff30 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
1ff40 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
1ff50 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
1ff60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1ff70 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
1ff80 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
1ff90 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
1ffa0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1ffb0 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1ffc0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
1ffd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
1ffe0 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
1fff0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
20000 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
20010 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
20020 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
20030 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
20040 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
20050 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
20060 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
20070 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
20080 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
20090 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
200a0 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70  on-commit .** op
200b0 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
200c0 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
200d0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
200e0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
200f0 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
20100 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
20110 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
20120 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
20130 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
20140 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
20150 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
20160 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
20170 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
20180 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
20190 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
201a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
201b0 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
201c0 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
201d0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
201e0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
201f0 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
20200 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20210 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
20220 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
20230 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
20240 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
20250 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
20260 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
20270 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
20280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20290 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
202a0 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
202b0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
202c0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
202d0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
202e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
202f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20300 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
20310 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
20320 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
20330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20340 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
20350 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
20360 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
20370 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
20380 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
20390 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
203a0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
203b0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
203c0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
203d0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
203e0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
203f0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
20400 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
20410 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
20420 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
20430 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
20440 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20450 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
20460 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
20470 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
20480 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
20490 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
204a0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
204b0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
204c0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
204d0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
204e0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
204f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
20500 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
20510 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
20520 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
20530 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20550 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20570 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
20580 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
20590 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
205a0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
205b0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
205c0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
205d0 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
205e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
205f0 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
20600 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
20610 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
20620 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
20630 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
20640 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
20650 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
20660 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
20670 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
20680 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
20690 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
206a0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
206b0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
206c0 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
206d0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
206e0 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
206f0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
20700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20710 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20720 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
20730 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69      /* If bCommi
20740 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  t is zero, this 
20750 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
20760 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
20770 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
20780 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
20790 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
207a0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
207b0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
207c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
207d0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
207e0 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69  nd, if bCommit i
207f0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
20800 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
20810 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
20820 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
20830 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
20840 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
20850 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
20860 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
20870 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
20880 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
20890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
208a0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45  ode = BTALLOC_LE
208b0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20  ;.        iNear 
208c0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
208d0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
208e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
208f0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
20900 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
20910 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
20920 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65  g, &iFreePg, iNe
20930 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  ar, eMode);.    
20940 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20960 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20970 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
20980 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
209a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
209b0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
209c0 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69  le( bCommit && i
209d0 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
209e0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
209f0 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
20a00 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
20a10 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
20a20 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
20a30 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
20a40 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b  reePg, bCommit);
20a50 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20a60 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
20a70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20a90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20aa0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
20ab0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
20ac0 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
20ad0 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
20ae0 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d  }while( iLastPg=
20af0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
20b00 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41  GE(pBt) || PTRMA
20b10 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
20b20 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42  astPg) );.    pB
20b30 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
20b40 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61   1;.    pBt->nPa
20b50 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20  ge = iLastPg;.  
20b60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
20b70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
20b80 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
20b90 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
20ba0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
20bb0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
20bc0 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67  ase.** nOrig pag
20bd0 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
20be0 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65  ining nFree free
20bf0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74   pages. Return t
20c00 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
20c10 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20c20 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f  base in pages fo
20c30 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d  llowing an auto-
20c40 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
20c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
20c60 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53   finalDbSize(BtS
20c70 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
20c80 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72   nOrig, Pgno nFr
20c90 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  ee){.  int nEntr
20ca0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
20cb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20cc0 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
20cd0 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
20ce0 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70  /.  Pgno nPtrmap
20cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20d00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20d10 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
20d20 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50   be freed */.  P
20d30 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d50 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
20d60 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  /..  nEntry = pB
20d70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
20d80 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46  .  nPtrmap = (nF
20d90 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
20da0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
20db0 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
20dc0 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ry;.  nFin = nOr
20dd0 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
20de0 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69  rmap;.  if( nOri
20df0 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
20e00 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
20e10 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
20e20 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
20e30 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  Fin--;.  }.  whi
20e40 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
20e50 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
20e60 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
20e70 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
20e80 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
20e90 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a  .  return nFin;.
20ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
20eb0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
20ec0 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
20ed0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
20ee0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
20ef0 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
20f00 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
20f10 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
20f20 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
20f30 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
20f40 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
20f50 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
20f60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
20f70 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
20f80 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
20f90 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
20fa0 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
20fb0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
20fc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
20fd0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
20fe0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
20ff0 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
21000 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
21010 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
21020 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
21030 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21040 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
21050 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
21070 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
21080 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
21090 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
210a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
210b0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
210c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
210d0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
210e0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e{.    Pgno nOri
210f0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
21100 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e  nt(pBt);.    Pgn
21110 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79  o nFree = get4by
21120 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
21130 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
21140 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e   Pgno nFin = fin
21150 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
21160 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20  rig, nFree);..  
21170 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e    if( nOrig<nFin
21180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
21190 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
211a0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
211b0 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
211c0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
211d0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
211e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
211f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21200 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
21210 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
21220 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72  (pBt);.        r
21230 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
21240 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f  ep(pBt, nFin, nO
21250 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  rig, 0);.      }
21260 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21290 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
212a0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
212b0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
212c0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
212d0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
212e0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
212f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
21310 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NE;.    }.  }.  
21320 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21330 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21340 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21350 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
21360 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
21370 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
21380 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
21390 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65  n.** is committe
213a0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
213b0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
213c0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
213d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
213e0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
213f0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
21400 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
21410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21420 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
21430 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
21440 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
21450 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
21460 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
21470 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
21480 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
21490 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
214a0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
214b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
214c0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
214d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
214e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
214f0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
21500 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
21510 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
21520 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
21530 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
21540 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20  t(pPager); )..  
21550 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21560 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
21570 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
21580 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
21590 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
215a0 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
215b0 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
215c0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
215d0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
215e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
215f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
21600 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
21610 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
21620 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
21630 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21640 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
21650 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
21660 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ly */.    Pgno i
21670 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
21680 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
21690 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
216a0 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
216b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
216c0 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
216d0 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
216e0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
216f0 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
21700 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
21710 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
21720 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
21730 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
21740 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
21750 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
21760 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
21770 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
21780 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
21790 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
217a0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
217b0 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
217c0 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
217d0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
217e0 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
217f0 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
21800 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
21810 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21820 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21830 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
21840 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
21850 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
21860 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  6]);.    nFin = 
21870 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
21880 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
21890 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
218a0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
218b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
218c0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f  .    if( nFin<nO
218d0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
218e0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
218f0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
21900 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65   }.    for(iFree
21910 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
21920 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
21930 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
21940 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
21950 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
21960 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20  in, iFree, 1);. 
21970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
21980 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
21990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
219a0 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
219b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
219c0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
219d0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
219e0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
219f0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
21a00 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
21a10 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
21a20 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
21a30 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
21a40 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
21a50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
21a60 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
21a70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
21a80 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = 1;.      pBt->
21a90 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
21aa0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
21ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21ac0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
21ad0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
21ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
21af0 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69  sert( nRef>=sqli
21b00 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
21b10 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
21b20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
21b30 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
21b40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21b50 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
21b60 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
21b70 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
21b80 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
21b90 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
21ba0 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  NT./*.** This fu
21bb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21bc0 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72 67   as part of merg
21bd0 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e  ing an CONCURREN
21be0 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  T transaction wi
21bf0 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73 68  th.** the snapsh
21c00 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20 6f  ot at the head o
21c10 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e 20  f the wal file. 
21c20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c 6c  It relocates all
21c30 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a   pages in the.**
21c40 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e 69   range iFirst..i
21c50 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e  Last, inclusive.
21c60 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
21c70 68 61 74 20 74 68 65 20 42 74 72 65 65 50 74 72  hat the BtreePtr
21c80 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  map .** structur
21c90 65 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4d  e at BtShared.pM
21ca0 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ap contains the 
21cb0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
21cc0 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63 68  pointers to each
21cd0 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20  .** page in the 
21ce0 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  range..**.** If 
21cf0 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55 4c  pnCurrent is NUL
21d00 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  L, then all page
21d10 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 61  s in the range a
21d20 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72 72  re moved to curr
21d30 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c 6f  ently.** free lo
21d40 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66 72  cations (i.e. fr
21d50 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29  ee-list entries)
21d60 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61   within the data
21d70 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
21d80 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74 2e   page.** iFirst.
21d90 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70 6e  .**.** Or, if pn
21da0 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20 4e  Current is not N
21db0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f 69  ULL, then it poi
21dc0 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20 63  nts to a value c
21dd0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  ontaining the.**
21de0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
21df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21e00 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e 20  le in pages. In 
21e10 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20 70  this case, all p
21e20 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c 6f  ages are.** relo
21e30 63 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e 64  cated to the end
21e40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21e50 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46 69   file - page iFi
21e60 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65 64  rst is relocated
21e70 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70 6e   to.** page (*pn
21e80 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67 65  Current+1), page
21e90 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61 67   iFirst+1 to pag
21ea0 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32 29  e (*pnCurrent+2)
21eb0 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20  , and so on..** 
21ec0 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e 74  Value *pnCurrent
21ed0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
21ee0 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ew size of the d
21ef0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
21f00 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
21f10 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
21f20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
21f30 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
21f40 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
21f50 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
21f60 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
21f70 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
21f80 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20 20  elocateRange(.  
21f90 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c 65  /* B-tree handle
21fc0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72 73   */.  Pgno iFirs
21fd0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21fe0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
21ff0 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20  age to relocate 
22000 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 2c  */.  Pgno iLast,
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67       /* Last pag
22030 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f  e to relocate */
22040 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72 65  .  Pgno *pnCurre
22050 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
22060 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
22070 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61 62  L, IN/OUT: Datab
22080 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ase size */.){. 
22090 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
220a0 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72 6d  _OK;.  BtreePtrm
220b0 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
220c0 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50 67  pMap;.  Pgno iPg
220d0 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46 69  ;..  for(iPg=iFi
220e0 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20  rst; iPg<=iLast 
220f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
22100 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d 65  ; iPg++){.    Me
22110 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20 30  mPage *pFree = 0
22120 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61 6c  ;     /* Page al
22130 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72 65  located from fre
22140 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d 65  e-list */.    Me
22150 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
22160 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20 20      Pgno iNew;  
22170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22180 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ew page number f
22190 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50 74  or pPg */.    Pt
221a0 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72  rmapEntry *pEntr
221b0 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  y;    /* Pointer
221c0 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
221d0 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20 20  age iPg */..    
221e0 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e 47  if( iPg==PENDING
221f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
22200 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22210 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d 3e  pEntry = &pMap->
22220 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70 2d  aPtr[iPg - pMap-
22230 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20 69  >iFirst];..    i
22240 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65  f( pEntry->eType
22250 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
22260 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  E ){.      Pgno 
22270 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63 20  dummy;.      rc 
22280 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
22290 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c  age(pBt, &pFree,
222a0 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42 54   &dummy, iPg, BT
222b0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
222c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
222d0 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73  pFree);.      as
222e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
222f0 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50  _OK || dummy==iP
22300 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  g );.    }else i
22310 66 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a  f( pnCurrent ){.
22320 20 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61        btreeGetPa
22330 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50  ge(pBt, iPg, &pP
22340 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  g, 0);.      ass
22350 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
22360 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 67  rIswriteable(pPg
22370 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
22380 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22390 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
223a0 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67  ount(pPg->pDbPag
223b0 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  e)==1 );.      i
223c0 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72  New = ++(*pnCurr
223d0 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
223e0 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  iNew==PENDING_BY
223f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 69  TE_PAGE(pBt) ) i
22400 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72  New = ++(*pnCurr
22410 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ent);.      rc =
22420 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
22430 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e  t, pPg, pEntry->
22440 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70  eType, pEntry->p
22450 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b  arent, iNew, 1);
22460 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
22470 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  geNotNull(pPg);.
22480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22490 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
224a0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
224b0 72 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72  ree, &iNew, iFir
224c0 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45  st-1, BTALLOC_LE
224d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
224e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
224f0 7c 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b  | iNew<iFirst );
22500 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22520 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22530 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  pFree);.        
22540 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
22550 2c 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b  , iPg, &pPg, 0);
22560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
22570 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
22580 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79  pPg, pEntry->eTy
22590 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65  pe, pEntry->pare
225a0 6e 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20  nt,iNew,1);.    
225b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
225c0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
225d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
225e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69   rc;.}../* !defi
225f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22600 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
22610 2a 20 54 68 65 20 62 2d 74 72 65 65 20 68 61 6e  * The b-tree han
22620 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
22630 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
22640 69 73 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d  is about to comm
22650 69 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52  it an.** CONCURR
22660 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ENT transaction.
22670 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
22680 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22690 74 68 61 74 20 74 68 69 73 20 69 73 20 0a 2a 2a  that this is .**
226a0 20 70 6f 73 73 69 62 6c 65 20 2d 20 74 68 65 20   possible - the 
226b0 77 61 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b 20  wal WRITER lock 
226c0 69 73 20 68 65 6c 64 20 61 6e 64 20 69 74 20 69  is held and it i
226d0 73 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  s known that the
226e0 72 65 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f  re are .** no co
226f0 6e 66 6c 69 63 74 73 20 77 69 74 68 20 63 6f 6d  nflicts with com
22700 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
22710 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
22720 6e 74 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63  nt btreeFixUnloc
22730 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ked(Btree *p){. 
22740 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22750 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
22760 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
22770 2d 3e 70 50 61 67 65 31 3b 0a 20 20 75 38 20 2a  ->pPage1;.  u8 *
22780 70 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  p1 = pPage1->aDa
22790 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ta;.  Pager *pPa
227a0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
227b0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
227c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
227d0 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  f page 1 of the 
227e0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
227f0 77 72 69 74 61 62 6c 65 2c 20 74 68 65 6e 20 6e  writable, then n
22800 6f 20 70 61 67 65 73 20 77 65 72 65 20 61 6c 6c  o pages were all
22810 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20 66  ocated.  ** or f
22820 72 65 65 64 20 62 79 20 74 68 69 73 20 74 72 61  reed by this tra
22830 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
22840 73 20 63 61 73 65 20 6e 6f 20 73 70 65 63 69 61  s case no specia
22850 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a 20  l handling is . 
22860 20 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74   ** required. Ot
22870 68 65 72 77 69 73 65 2c 20 69 66 20 70 61 67 65  herwise, if page
22880 20 31 20 69 73 20 64 69 72 74 79 2c 20 70 72 6f   1 is dirty, pro
22890 63 65 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72 65  ceed.  */.  Btre
228a0 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20  ePtrmap *pMap = 
228b0 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e  pBt->pMap;.  Pgn
228c0 6f 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  o iTrunk = get4b
228d0 79 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20  yte(&p1[32]);.  
228e0 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74 72  Pgno nPage = btr
228f0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
22900 3b 0a 20 20 75 33 32 20 6e 46 72 65 65 20 3d 20  ;.  u32 nFree = 
22910 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d  get4byte(&p1[36]
22920 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
22930 74 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20  t->pMap );.  rc 
22940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70  = sqlite3PagerUp
22950 67 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50  gradeSnapshot(pP
22960 61 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44  ager, pPage1->pD
22970 62 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  bPage);.  assert
22980 28 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44  ( p1==pPage1->aD
22990 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  ata );..  if( rc
229a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
229b0 20 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d     Pgno nHPage =
229c0 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38   get4byte(&p1[28
229d0 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
229e0 6e 20 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20  n = nHPage;     
229f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
22a00 62 20 61 66 74 65 72 20 74 72 61 6e 73 61 63 74  b after transact
22a10 69 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20  ion merge */..  
22a20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
22a30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
22a40 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
22a50 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54  {.      Pgno iHT
22a60 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
22a70 26 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  &p1[32]);.      
22a80 75 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74  u32 nHFree = get
22a90 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a  4byte(&p1[36]);.
22aa0 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68  .      /* Attach
22ab0 20 74 68 65 20 68 65 61 64 20 64 61 74 61 62 61   the head databa
22ac0 73 65 20 66 72 65 65 20 6c 69 73 74 20 74 6f 20  se free list to 
22ad0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
22ae0 75 72 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  urrent.      ** 
22af0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 65  transactions fre
22b00 65 2d 6c 69 73 74 20 28 69 66 20 61 6e 79 29 2e  e-list (if any).
22b10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
22b20 54 72 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Trunk!=0 ){.    
22b30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31      put4byte(&p1
22b40 5b 33 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20 6e  [36], nHFree + n
22b50 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Free);.        p
22b60 75 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 2c  ut4byte(&p1[32],
22b70 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20   iTrunk);.      
22b80 20 20 77 68 69 6c 65 28 20 69 54 72 75 6e 6b 20    while( iTrunk 
22b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50  ){.          DbP
22ba0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73 71  age *pTrunk = sq
22bb0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
22bc0 28 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 29  (pPager, iTrunk)
22bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 72 75  ;.          iTru
22be0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 28 75  nk = get4byte((u
22bf0 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61  8*)pTrunk->pData
22c00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22c10 20 69 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20   iTrunk==0 ){.  
22c20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
22c30 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e  te((u8*)pTrunk->
22c40 70 44 61 74 61 2c 20 69 48 54 72 75 6e 6b 29 3b  pData, iHTrunk);
22c50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
22c70 67 65 72 55 6e 72 65 66 28 70 54 72 75 6e 6b 29  gerUnref(pTrunk)
22c80 3b 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  ;.        };.   
22c90 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
22ca0 6e 48 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69 46  nHPage<(pMap->iF
22cb0 69 72 73 74 2d 31 29 20 29 7b 0a 20 20 20 20 20  irst-1) ){.     
22cc0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
22cd0 73 65 20 63 6f 6e 73 69 73 74 65 64 20 6f 66 20  se consisted of 
22ce0 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29  (pMap->iFirst-1)
22cf0 20 70 61 67 65 73 20 77 68 65 6e 20 74 68 65 20   pages when the 
22d00 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20  current.        
22d10 2a 2a 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72  ** concurrent tr
22d20 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
22d30 65 6e 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f 6e  ened. And an con
22d40 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
22d50 69 6f 6e 20 6d 61 79 0a 20 20 20 20 20 20 20 20  ion may.        
22d60 2a 2a 20 6e 6f 74 20 62 65 20 65 78 65 63 75 74  ** not be execut
22d70 65 64 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76 61  ed on an auto-va
22d80 63 75 75 6d 20 64 61 74 61 62 61 73 65 20 2d 20  cuum database - 
22d90 73 6f 20 74 68 65 20 64 62 20 73 68 6f 75 6c 64  so the db should
22da0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74   .        ** not
22db0 20 68 61 76 65 20 73 68 72 75 6e 6b 20 73 69 6e   have shrunk sin
22dc0 63 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ce the transacti
22dd0 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54  on was opened. T
22de0 68 65 72 65 66 6f 72 65 20 6e 48 50 61 67 65 0a  herefore nHPage.
22df0 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c          ** shoul
22e00 64 20 62 65 20 73 65 74 20 74 6f 20 28 70 4d 61  d be set to (pMa
22e10 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 6f 72 20  p->iFirst-1) or 
22e20 67 72 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20  greater. */.    
22e30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22e40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22e60 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
22e70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c  t transaction al
22e80 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20 70 4d  located pages pM
22e90 61 70 2d 3e 69 46 69 72 73 74 20 74 68 72 6f 75  ap->iFirst throu
22ea0 67 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 50  gh.        ** nP
22eb0 61 67 65 20 28 69 6e 63 6c 75 73 69 76 65 29 20  age (inclusive) 
22ec0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
22ed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22ee0 20 4d 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20 20   Meanwhile,.    
22ef0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 74 72 61      ** other tra
22f00 6e 73 61 63 74 69 6f 6e 73 20 68 61 76 65 20 61  nsactions have a
22f10 6c 6c 6f 63 61 74 65 64 20 28 69 46 69 72 73 74  llocated (iFirst
22f20 2e 2e 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d 6f  ..nHPage). So mo
22f30 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ve.        ** pa
22f40 67 65 73 20 28 69 46 69 72 73 74 2e 2e 4d 49 4e  ges (iFirst..MIN
22f50 28 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 29 20  (nPage,nHPage)) 
22f60 74 6f 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e 48  to (MAX(nPage,nH
22f70 50 61 67 65 29 2b 31 29 2e 20 20 2a 2f 0a 20 20  Page)+1).  */.  
22f80 20 20 20 20 20 20 50 67 6e 6f 20 69 4c 61 73 74        Pgno iLast
22f90 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48   = MIN(nPage, nH
22fa0 50 61 67 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73  Page);    /* Las
22fb0 74 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  t page to move *
22fc0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  /.        Pgno n
22fd0 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ff0 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   Current size of
23000 20 64 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e   db */.        n
23010 43 75 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e 50  Current = MAX(nP
23020 61 67 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20  age, nHPage);.  
23030 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
23040 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42  RelocateRange(pB
23050 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c  t, pMap->iFirst,
23060 20 69 4c 61 73 74 2c 20 26 6e 43 75 72 72 65 6e   iLast, &nCurren
23070 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  t);..        /* 
23080 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f  There are now no
23090 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68   collisions with
230a0 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74   the snapshot at
230b0 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
230c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
230d0 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 61 74  base file. So at
230e0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
230f0 6f 75 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65  ould be possible
23100 20 74 6f 20 77 72 69 74 65 0a 20 20 20 20 20 20   to write.      
23110 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
23120 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
23130 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73  . Before doing s
23140 6f 20 74 68 6f 75 67 68 2c 20 61 74 74 65 6d 70  o though, attemp
23150 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
23160 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66  relocate some of
23170 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 74   the new pages t
23180 6f 20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73  o free locations
23190 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79   within the body
231a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
231b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
231c0 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74   (i.e. free-list
231d0 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20   entries). */.  
231e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
231f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23200 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 75       assert( nCu
23210 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42  rrent!=PENDING_B
23220 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
23230 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23240 65 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65  e3PagerSetDbsize
23250 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43  (pBt->pPager, nC
23260 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  urrent);.       
23270 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
23280 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20  yte(&p1[36]);.  
23290 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e          nFin = n
232a0 43 75 72 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20  Current-nFree;. 
232b0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 75           if( nCu
232c0 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59  rrent>PENDING_BY
232d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
232e0 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin<=PENDING_BY
232f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
23300 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e              nFin
23310 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  --;.          }.
23320 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d            nFin =
23330 20 4d 41 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67   MAX(nFin, nHPag
23340 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
23350 20 3d 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65   = btreeRelocate
23360 52 61 6e 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b  Range(pBt, nFin+
23370 31 2c 20 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b  1, nCurrent, 0);
23380 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23390 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31      put4byte(&p1
233a0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
233b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
233c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62  qlite3PagerSetDb
233d0 73 69 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69  size(pPager, nFi
233e0 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
233f0 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
23400 64 65 66 69 6e 65 20 62 74 72 65 65 46 69 78 55  define btreeFixU
23410 6e 6c 6f 63 6b 65 64 28 58 29 20 20 53 51 4c 49  nlocked(X)  SQLI
23420 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20  TE_OK.#endif /* 
23430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
23440 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  URRENT */../*.**
23450 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
23460 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
23470 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
23480 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
23490 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
234a0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
234b0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
234c0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
234d0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
234e0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
234f0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
23500 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
23510 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
23520 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
23530 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
23540 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
23550 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
23560 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
23570 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
23580 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
23590 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
235a0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
235b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
235c0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
235d0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
235e0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
235f0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
23600 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
23610 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
23620 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
23630 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
23640 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
23650 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
23660 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
23670 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
23680 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
23690 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
236a0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
236b0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
236c0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
236d0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
236e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
236f0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
23700 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
23710 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
23720 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
23730 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
23740 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
23750 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
23760 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
23770 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
23780 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
23790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
237a0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
237b0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
237c0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
237d0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
237e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
237f0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
23800 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
23810 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
23820 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
23830 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
23840 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
23850 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
23860 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
23870 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
23880 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
23890 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
238a0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
238b0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
238c0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
238d0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
238e0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
238f0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
23900 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
23910 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
23920 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
23930 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
23940 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
23950 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
23960 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
23970 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
23980 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
23990 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
239a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
239b0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
239c0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
239d0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
239e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
239f0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
23a00 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23a10 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
23a20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
23a30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
23a40 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65  nter(p);..#ifnde
23a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23a60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
23a70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
23a80 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23a90 28 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d  ( ISCONCURRENT==
23aa0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
23ab0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
23ac0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
23ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23ae0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23af0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
23b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
23b10 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
23b20 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
23b30 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
23b40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
23b50 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
23b60 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
23b70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
23b80 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  dif.    if( rc==
23b90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 43  SQLITE_OK && ISC
23ba0 4f 4e 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20  ONCURRENT ){.   
23bb0 20 20 20 72 63 20 3d 20 62 74 72 65 65 46 69 78     rc = btreeFix
23bc0 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20  Unlocked(p);.   
23bd0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23c00 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
23c10 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
23c20 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
23c30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
23c40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
23c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23c60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23c70 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
23c80 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
23c90 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
23ca0 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
23cb0 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
23cc0 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
23cd0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
23ce0 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
23cf0 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
23d00 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
23d10 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
23d20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
23d30 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
23d40 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
23d50 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
23d60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23d70 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
23d80 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
23d90 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
23da0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
23db0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
23dc0 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
23dd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
23de0 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
23df0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
23e00 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
23e10 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
23e20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
23e30 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
23e40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
23e50 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
23e60 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
23e70 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
23e80 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
23e90 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
23ea0 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
23eb0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
23ec0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
23ed0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
23ee0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
23ef0 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
23f00 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
23f10 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
23f20 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
23f30 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
23f40 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
23f50 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
23f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
23f70 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
23f80 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
23f90 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
23fa0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
23fb0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
23fc0 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
23fd0 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
23fe0 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
23ff0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
24000 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
24010 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
24020 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
24030 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
24040 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
24050 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
24060 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
24070 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
24080 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
24090 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
240a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
240b0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
240c0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
240d0 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
240e0 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
240f0 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
24100 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
24110 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
24120 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
24130 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
24140 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
24150 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
24160 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
24170 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
24180 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
24190 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   an CONCURRENT t
241a0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65  ransaction, dele
241b0 74 65 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70  te the pBt->pMap
241c0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c   object..  ** Al
241d0 73 6f 20 63 61 6c 6c 20 50 61 67 65 72 45 6e 64  so call PagerEnd
241e0 43 6f 6e 63 75 72 72 65 6e 74 28 29 20 74 6f 20  Concurrent() to 
241f0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
24200 70 61 67 65 72 20 68 61 73 20 64 69 73 63 61 72  pager has discar
24210 64 65 64 0a 20 20 2a 2a 20 74 68 65 20 72 65 63  ded.  ** the rec
24220 6f 72 64 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ord of all pages
24230 20 72 65 61 64 20 77 69 74 68 69 6e 20 74 68 65   read within the
24240 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
24250 2f 0a 20 20 62 74 72 65 65 50 74 72 6d 61 70 44  /.  btreePtrmapD
24260 65 6c 65 74 65 28 70 42 74 29 3b 0a 20 20 73 71  elete(pBt);.  sq
24270 6c 69 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e  lite3PagerEndCon
24280 63 75 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61  current(pBt->pPa
24290 67 65 72 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  ger);.  btreeInt
242a0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
242b0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
242c0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
242d0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
242e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
242f0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
24300 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
24310 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
24320 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
24330 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
24340 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
24350 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
24360 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
24370 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
24380 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
24390 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
243a0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
243b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
243c0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
243d0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
243e0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
243f0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
24400 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
24410 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
24420 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
24430 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
24440 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
24450 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
24460 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
24470 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
24480 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
24490 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
244a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
244b0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
244c0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
244d0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
244e0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
244f0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
24500 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
24510 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
24520 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
24530 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
24540 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
24550 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
24560 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
24570 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
24580 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
24590 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
245a0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
245b0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
245c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
245d0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
245e0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
245f0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
24600 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
24610 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
24620 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
24630 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
24640 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
24650 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
24660 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
24670 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
24680 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
24690 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
246a0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
246b0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
246c0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
246d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
246e0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
246f0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
24700 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
24710 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
24720 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
24730 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
24740 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
24750 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
24760 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
24770 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
24780 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
24790 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
247a0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
247b0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
247c0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
247d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
247e0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
247f0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
24800 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
24810 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
24820 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
24830 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
24840 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
24850 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
24860 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
24870 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
24880 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
24890 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
248a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
248b0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
248c0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
248d0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
248e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
248f0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
24900 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
24910 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
24920 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
24930 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
24940 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
24950 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
24960 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
24970 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
24980 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
24990 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
249a0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
249b0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
249c0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
249d0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
249e0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
249f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
24a00 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
24a10 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
24a20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24a30 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
24a40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24a50 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
24a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24a70 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
24a80 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
24a90 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
24aa0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
24ab0 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
24ac0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
24ad0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
24ae0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
24af0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
24b00 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
24b10 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
24b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
24b30 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
24b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
24b50 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
24b60 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
24b70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24b80 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
24b90 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
24ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
24bb0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
24bc0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
24bd0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
24be0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
24c00 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
24c10 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
24c20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
24c30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
24c40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24c50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24c60 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
24c70 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
24c80 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
24c90 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
24ca0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
24cb0 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
24cc0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
24cd0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
24ce0 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
24cf0 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
24d00 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
24d10 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
24d20 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
24d30 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
24d40 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
24d50 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
24d60 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
24d70 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
24d80 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
24d90 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
24da0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24db0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
24dc0 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
24dd0 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
24de0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
24df0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
24e00 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
24e10 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
24e20 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
24e30 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
24e40 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
24e50 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
24e60 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
24e70 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
24e80 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
24e90 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
24ea0 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
24eb0 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
24ec0 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
24ed0 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
24ee0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
24ef0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
24f00 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
24f10 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
24f20 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
24f30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
24f40 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
24f50 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
24f60 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
24f70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
24f80 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
24f90 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
24fa0 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
24fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
24fc0 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
24fd0 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
24fe0 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
24ff0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
25000 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
25010 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
25020 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
25030 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
25040 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
25050 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
25060 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
25070 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
25080 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
25090 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
250a0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
250b0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
250c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
250d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
250e0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
250f0 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
25100 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
25110 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
25120 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
25130 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
25140 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
25150 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
25160 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
25170 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
25180 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
25190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
251a0 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
251b0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
251c0 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
251d0 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
251e0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
251f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
25200 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
25210 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
25220 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
25230 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
25240 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
25250 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
25260 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
25270 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
25280 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
25290 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
252a0 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
252b0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
252c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
252d0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
252e0 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
252f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
25310 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
25320 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
25330 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
25340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
25350 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
25360 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
25370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25380 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
25390 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
253a0 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
253b0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
253c0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
253d0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
253e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65      }.      btre
253f0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
25400 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d  rPages(p);.    }
25410 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
25420 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
25430 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
25450 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
25460 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
25470 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
25480 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
25490 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
254a0 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
254b0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
254c0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
254d0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
254e0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
254f0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
25500 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
25510 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
25520 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
25530 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
25540 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
25550 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
25560 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
25570 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
25580 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
25590 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
255a0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
255b0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
255c0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
255d0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
255e0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
255f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25600 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
25610 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
25620 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
25630 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
25640 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
25650 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
25660 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
25670 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
25680 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
25690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
256a0 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
256b0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
256c0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
256d0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
256e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
256f0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
25700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25710 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
25720 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
25730 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
25740 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
25750 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
25760 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
25770 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
25780 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
25790 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
257a0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
257b0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
257c0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
257d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
257e0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
257f0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
25800 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
25810 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
25820 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
25830 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
25840 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
25850 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
25860 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
25870 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
25880 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
25890 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
258a0 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
258b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
258c0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
258d0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
258e0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
258f0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
25900 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
25910 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
25920 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
25930 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
25940 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
25950 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
25960 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
25970 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
25980 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
25990 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
259a0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
259b0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
259c0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
259d0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
259e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
259f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
25a00 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
25a10 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
25a20 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
25a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
25a40 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
25a50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
25a60 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
25a70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
25a80 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
25a90 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
25aa0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
25ab0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
25ac0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
25ad0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25ae0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
25af0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
25b00 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
25b10 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
25b20 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
25b30 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
25b40 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
25b50 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
25b60 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
25b70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
25b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25b90 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
25ba0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
25bb0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
25bc0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
25bd0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
25be0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
25bf0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
25c00 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
25c10 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
25c20 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
25c30 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
25c40 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
25c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
25c60 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
25c70 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
25c80 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
25c90 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
25ca0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
25cb0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
25cc0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
25cd0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
25ce0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
25cf0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
25d00 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
25d10 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
25d20 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
25d30 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
25d40 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
25d50 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
25d60 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
25d70 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
25d80 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
25d90 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
25da0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
25db0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
25dc0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
25dd0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
25de0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
25df0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
25e00 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
25e10 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
25e20 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
25e30 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
25e40 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
25e50 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
25e60 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
25e70 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
25e80 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
25e90 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
25ea0 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
25eb0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
25ec0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
25ed0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
25ee0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
25ef0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
25f00 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
25f10 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
25f20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
25f30 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
25f40 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
25f50 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
25f60 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
25f70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25f80 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
25f90 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
25fa0 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
25fb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
25fc0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
25fd0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
25fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
25ff0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
26000 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
26010 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
26020 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
26030 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
26040 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
26050 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
26060 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
26070 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
26080 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
26090 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
260a0 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
260b0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
260c0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
260d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
260e0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
260f0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
26100 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
26110 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
26120 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
26130 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
26140 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
26150 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
26160 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
26170 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
26180 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
26190 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
261a0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
261b0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
261c0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
261d0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
261e0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
261f0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
26200 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26210 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
26220 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70  reePtrmapBegin(p
26230 42 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  Bt, iStatement);
26240 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
26250 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
26260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26270 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
26280 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
26290 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
262a0 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
262b0 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
262c0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
262d0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
262e0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
262f0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
26300 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
26310 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
26320 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
26330 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
26340 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
26350 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
26360 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
26370 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
26380 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
26390 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
263a0 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
263b0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
263c0 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
263d0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
263e0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
263f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26400 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
26410 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
26420 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
26430 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
26440 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
26450 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
26460 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
26470 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
26480 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
26490 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
264a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
264b0 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
264c0 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
264d0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
264e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
264f0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
26500 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
26510 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
26520 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
26530 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
26540 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
26550 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
26560 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
26570 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
26580 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
26590 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
265a0 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
265b0 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
265c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
265d0 74 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65  ter(p);.    btre
265e0 65 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20  ePtrmapEnd(pBt, 
265f0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
26600 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
26610 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
26620 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
26630 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
26640 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
26650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
26670 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
26680 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
26690 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
266a0 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
266b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
266c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
266d0 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
266e0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
266f0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
26700 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
26710 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
26720 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
26730 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
26740 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
26750 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
26760 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
26770 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
26780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
26790 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
267a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
267b0 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
267c0 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
267d0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
267e0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
267f0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
26800 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
26810 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
26820 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
26830 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
26840 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
26850 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
26860 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
26870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26880 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
26890 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
268a0 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
268b0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
268c0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
268d0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
268e0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
268f0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
26900 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
26910 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
26920 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
26930 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
26940 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
26950 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
26960 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
26970 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
26980 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
26990 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
269a0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
269b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
269c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54  .**.** If the BT
269d0 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66  REE_WRCSR bit of
269e0 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72   wrFlag is clear
269f0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
26a00 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65  r can only.** be
26a10 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
26a20 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45  g.  If the BTREE
26a30 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65  _WRCSR bit is se
26a40 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
26a50 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  or.** can be use
26a60 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
26a70 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20   for writing if 
26a80 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
26a90 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20   for writing.** 
26aa0 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
26ab0 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e  hese are the con
26ac0 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
26ad0 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
26ae0 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67  r.** for writing
26af0 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a   to be allowed:.
26b00 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
26b10 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
26b20 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
26b30 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e  wrFlag containin
26b40 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  g BTREE_WRCSR.**
26b50 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
26b60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
26b70 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
26b80 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
26b90 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
26ba0 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
26bb0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
26bc0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
26bd0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
26be0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
26bf0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
26c00 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
26c10 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
26c20 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
26c30 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
26c40 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
26c50 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
26c60 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
26c70 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
26c80 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
26c90 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
26ca0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
26cb0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
26cc0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
26cd0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
26ce0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
26cf0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
26d00 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  n..**.** The BTR
26d10 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74  EE_FORDELETE bit
26d20 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f   of wrFlag may o
26d30 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74  ptionally be set
26d40 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a   if BTREE_WRCSR.
26d50 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46  ** is set.  If F
26d60 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c  ORDELETE is set,
26d70 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20   that is a hint 
26d80 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
26d90 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68  ation that.** th
26da0 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f  is cursor will o
26db0 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73  nly be used to s
26dc0 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74  eek to and delet
26dd0 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20  e entries of an 
26de0 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74  index.** as part
26df0 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c   of a larger DEL
26e00 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ETE statement.  
26e10 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69  The FORDELETE hi
26e20 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  nt is not used b
26e30 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d  y.** this implem
26e40 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  entation.  But i
26e50 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c  n a hypothetical
26e60 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f   alternative sto
26e70 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20  rage engine .** 
26e80 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65  in which index e
26e90 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d  ntries are autom
26ea0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
26eb0 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64   when correspond
26ec0 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77  ing table.** row
26ed0 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74  s are deleted, t
26ee0 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61  he FORDELETE fla
26ef0 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74  g is a hint that
26f00 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45   all SEEK and DE
26f10 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  LETE.** operatio
26f20 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ns on this curso
26f30 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20  r can be no-ops 
26f40 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65  and all READ ope
26f50 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20  rations can .** 
26f60 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f  return a null ro
26f70 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31  w (2-bytes: 0x01
26f80 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   0x00)..**.** No
26f90 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
26fa0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
26fb0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
26fc0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
26fd0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
26fe0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
26ff0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
27000 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
27010 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
27020 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
27030 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
27040 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
27050 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
27060 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
27070 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
27080 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
27090 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
270a0 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
270b0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
270c0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
270d0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
270e0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
27110 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
27140 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
27150 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
27160 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27180 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
27190 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
271a0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
271b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
271c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
271d0 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
271e0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
271f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
27200 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
27210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
27220 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
27230 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
27240 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
27250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27260 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
27270 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
27280 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20  Cursor *pX;     
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20       /* Looping 
272b0 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63  over other all c
272c0 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  ursors */..  ass
272d0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
272e0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
272f0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
27300 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ag==0 .       ||
27310 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57   wrFlag==BTREE_W
27320 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  RCSR .       || 
27330 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57  wrFlag==(BTREE_W
27340 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45  RCSR|BTREE_FORDE
27350 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f  LETE) .  );..  /
27360 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
27370 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
27380 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
27390 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
273a0 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
273b0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
273c0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
273d0 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
273e0 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
273f0 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
27400 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
27410 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
27420 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
27430 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
27440 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
27450 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
27460 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
27470 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
27480 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67  Info!=0, (wrFlag
27490 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65  ?2:1)) );.  asse
274a0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
274b0 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
274c0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
274d0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
274e0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
274f0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
27500 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
27510 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
27520 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
27530 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
27540 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
27550 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
27560 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
27570 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
27580 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
27590 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
275a0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
275b0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
275c0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
275d0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72  ==0 );..  if( wr
275e0 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
275f0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
27600 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
27610 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
27620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27630 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
27640 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
27650 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
27660 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
27670 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
27680 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
27690 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
276a0 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
276b0 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
276c0 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
276d0 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
276e0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
276f0 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
27700 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
27710 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
27720 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
27730 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
27740 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
27750 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
27760 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
27770 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
27780 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
27790 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
277a0 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
277b0 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46  ag ? BTCF_WriteF
277c0 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d  lag : 0;.  pCur-
277d0 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d  >curPagerFlags =
277e0 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41   wrFlag ? 0 : PA
277f0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
27800 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ;.  /* If there 
27810 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
27820 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
27830 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
27840 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75  all such.  ** cu
27850 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76  rsors *must* hav
27860 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  e the BTCF_Multi
27870 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f  ple flag set. */
27880 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70  .  for(pX=pBt->p
27890 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70  Cursor; pX; pX=p
278a0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
278b0 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  f( pX->pgnoRoot=
278c0 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b  =(Pgno)iTable ){
278d0 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c  .      pX->curFl
278e0 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
278f0 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72  iple;.      pCur
27900 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
27910 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
27920 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
27930 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
27940 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72  sor;.  pBt->pCur
27950 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
27960 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
27970 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
27980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27990 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
279a0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
279b0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
279e0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
279f0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
27a20 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
27a30 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
27a40 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
27a70 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
27a80 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
27a90 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
27ac0 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
27ad0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27b00 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
27b10 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
27b20 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61  nt rc;.  if( iTa
27b30 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20  ble<1 ){.    rc 
27b40 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
27b50 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
27b60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
27b70 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
27b80 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
27b90 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
27ba0 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
27bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
27bc0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
27bd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27be0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
27bf0 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
27c00 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
27c10 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
27c20 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
27c30 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
27c40 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
27c50 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
27c60 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
27c70 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
27c80 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
27c90 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
27ca0 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
27cb0 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
27cc0 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
27cd0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
27ce0 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
27cf0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
27d00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27d10 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
27d20 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
27d30 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
27d40 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
27d50 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
27d60 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
27d70 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
27d80 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
27d90 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
27da0 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
27db0 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
27dc0 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
27dd0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
27de0 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
27df0 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
27e00 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
27e10 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
27e20 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
27e30 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
27e40 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
27e50 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
27e60 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
27e70 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
27e80 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
27e90 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
27ea0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
27eb0 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
27ec0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
27ed0 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
27ee0 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54  tof(BtCursor, BT
27ef0 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49  CURSOR_FIRST_UNI
27f00 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NIT));.}../*.** 
27f10 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
27f20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
27f30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
27f40 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
27f50 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
27f60 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
27f70 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
27f80 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
27f90 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
27fa0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
27fb0 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
27fc0 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
27fd0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
27fe0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
27ff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
28000 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
28010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
28020 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
28030 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
28040 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
28050 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
28060 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
28070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28080 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
28090 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
280a0 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
280b0 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
280c0 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
280d0 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
280e0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
280f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
28100 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
28110 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
28120 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
28130 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
28140 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
28150 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
28160 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
28170 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63  pCur);.    unloc
28180 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
28190 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
281a0 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
281b0 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69  rflow);.    sqli
281c0 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
281d0 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
281e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
281f0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
28200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28210 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
28220 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
28230 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
28240 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
28250 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
28260 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
28270 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
28280 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
28290 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
282a0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
282b0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
282c0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
282d0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
282e0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
282f0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
28300 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
28310 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
28320 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
28330 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a  ParseCell()..*/.
28340 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
28350 20 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c   static int cell
28360 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c 49 6e  InfoEqual(CellIn
28370 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f 20  fo *a, CellInfo 
28380 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  *b){.    if( a->
28390 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20 29 20  nKey!=b->nKey ) 
283a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
283b0 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21 3d 62  ( a->pPayload!=b
283c0 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72 65 74  ->pPayload ) ret
283d0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
283e0 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e  ->nPayload!=b->n
283f0 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e  Payload ) return
28400 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e   0;.    if( a->n
28410 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c  Local!=b->nLocal
28420 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
28430 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21 3d 62   if( a->nSize!=b
28440 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75 72 6e  ->nSize ) return
28450 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   0;.    return 1
28460 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
28470 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
28480 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
28490 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
284a0 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65   info;.    memse
284b0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
284c0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
284d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
284e0 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
284f0 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  >ix, &info);.   
28500 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
28510 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45  _DB || cellInfoE
28520 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70 43 75  qual(&info, &pCu
28530 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a  r->info) );.  }.
28540 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
28550 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
28560 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
28570 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
28580 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
28590 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
285a0 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  {.  if( pCur->in
285b0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
285c0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
285d0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
285e0 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61  Key;.    btreePa
285f0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
28600 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43  age,pCur->ix,&pC
28610 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
28620 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65  se{.    assertCe
28630 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
28640 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
28650 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
28660 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
28670 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
28680 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
28690 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
286a0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
286b0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
286c0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
286d0 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
286e0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
286f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
28700 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
28710 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
28720 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
28730 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
28740 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
28750 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
28760 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
28770 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
28780 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
28790 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
287a0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
287b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
287c0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
287d0 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c  DEBUG */.int sql
287e0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
287f0 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f  sValidNN(BtCurso
28800 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
28810 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
28820 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53   return pCur->eS
28830 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28840 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ID;.}../*.** Ret
28850 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
28860 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
28870 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20   or "rowid" for 
28880 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a  a table btree..*
28890 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
288a0 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72  s only valid for
288b0 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
288c0 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
288d0 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61  a.** ordinary ta
288e0 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20 74  ble btree.  If t
288f0 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
28900 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72   to an index btr
28910 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61  ee or.** is inva
28920 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20  lid, the result 
28930 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
28940 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
28950 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
28960 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75  eIntegerKey(BtCu
28970 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
28980 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28990 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
289a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
289b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
289c0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
289d0 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
289e0 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ey );.  getCellI
289f0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
28a00 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
28a10 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Key;.}..#ifdef S
28a20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
28a30 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a  SET_SQL_FUNC./*.
28a40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
28a50 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61  fset into the da
28a60 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
28a70 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
28a80 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f 20 77  .** payload to w
28a90 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
28aa0 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a  is pointing..*/.
28ab0 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
28ac0 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f 72 20  Offset(BtCursor 
28ad0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
28ae0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28af0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28b00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28b10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28b20 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
28b30 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
28b40 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70 42 74  n (i64)pCur->pBt
28b50 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69 36 34  ->pageSize*((i64
28b60 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67  )pCur->pPage->pg
28b70 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20 20 20  no - 1) +.      
28b80 20 20 20 28 69 36 34 29 28 70 43 75 72 2d 3e 69     (i64)(pCur->i
28b90 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
28ba0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
28bb0 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  a);.}.#endif /* 
28bc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
28bd0 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f  FSET_SQL_FUNC */
28be0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
28bf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28c00 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f  es of payload fo
28c10 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
28c20 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72   pCur is.** curr
28c30 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
28c40 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74  o.  For table bt
28c50 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
28c60 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  be the amount.**
28c70 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69   of data.  For i
28c80 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69  ndex btrees, thi
28c90 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69  s will be the si
28ca0 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a  ze of the key..*
28cb0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
28cc0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
28cd0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
28ce0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
28cf0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
28d00 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
28d10 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
28d20 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
28d30 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
28d40 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
28d50 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
28d60 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28d70 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  D..*/.u32 sqlite
28d80 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
28d90 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
28da0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
28db0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
28dc0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
28dd0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28de0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
28df0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
28e00 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
28e10 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
28e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
28e30 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28e40 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
28e50 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
28e60 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
28e70 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
28e80 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
28e90 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
28ea0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
28eb0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
28ec0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
28ed0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
28ee0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
28ef0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
28f00 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
28f10 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
28f20 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
28f30 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
28f40 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
28f50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
28f60 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
28f70 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
28f80 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
28f90 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
28fa0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
28fb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
28fc0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
28fd0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
28fe0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
28ff0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
29000 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
29010 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
29020 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
29030 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
29040 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
29050 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
29060 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
29070 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
29080 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
29090 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
290a0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
290b0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
290c0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
290d0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
290e0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
290f0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
29100 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
29110 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
29120 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
29130 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
29140 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
29150 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
29160 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
29170 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
29180 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
29190 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
291a0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
291b0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
291c0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
291d0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
291e0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
291f0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
29200 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
29210 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
29220 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
29230 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
29240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
29250 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
29260 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
29270 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
29280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
29290 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
292a0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
292b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
292c0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
292d0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
292e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
292f0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
29300 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
29310 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
29320 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29330 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
29340 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29350 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
29360 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
29370 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
29380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29390 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
293a0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
293b0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
293c0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
293d0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
293e0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
293f0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
29400 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
29410 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
29420 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
29430 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
29440 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
29450 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
29460 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
29470 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
29480 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
29490 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
294a0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
294b0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
294c0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
294d0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
294e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
294f0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
29500 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
29510 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
29520 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
29530 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
29540 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
29550 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
29560 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
29570 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
29580 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
29590 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
295a0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
295b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
295c0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
295d0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
295e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
295f0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
29600 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
29610 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
29620 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
29630 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
29640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
29650 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
29660 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
29670 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
29680 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
29690 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
296a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
296b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
296c0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
296d0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
296e0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
296f0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
29700 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
29710 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
29720 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
29730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29740 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
29750 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
29760 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
29770 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
29780 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
29790 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
297a0 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
297b0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
297c0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
297d0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
297e0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
297f0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
29800 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
29810 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
29820 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
29830 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
29840 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
29850 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
29860 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
29870 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
29880 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
29890 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
298a0 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
298b0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
298c0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
298d0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
298e0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
298f0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
29900 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
29910 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
29920 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
29930 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
29940 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
29950 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
29960 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
29970 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
29980 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
29990 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
299a0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
299b0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
299c0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
299d0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
299e0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
299f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
29a00 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
29a10 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
29a20 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
29a30 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
29a40 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
29a50 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
29a60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29a70 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
29a80 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
29ab0 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
29ac0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
29ad0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
29ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
29af0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
29b00 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
29b10 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
29b20 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
29b30 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
29b40 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
29b50 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
29b60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29b70 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
29b80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
29ba0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
29bb0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
29bc0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
29bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29be0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
29bf0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
29c00 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
29c10 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
29c20 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
29c30 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
29c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
29c60 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
29c70 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
29c80 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
29c90 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
29ca0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
29cb0 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
29cc0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
29cd0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
29ce0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
29cf0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
29d00 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
29d10 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
29d20 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
29d30 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
29d40 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
29d50 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
29d60 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
29d70 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
29d80 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
29d90 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
29da0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
29db0 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
29dc0 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
29dd0 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
29de0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
29df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
29e00 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
29e10 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
29e20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
29e30 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
29e40 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
29e50 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
29e60 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
29e70 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
29e80 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
29e90 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
29ea0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20  erflow pages.** 
29eb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
29ec0 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
29ed0 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
29ee0 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20  populate.** the 
29ef0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
29f00 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28  st cache array (
29f10 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
29f20 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75  ow). .** Subsequ
29f30 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
29f40 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  is cache to make
29f50 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
29f60 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
29f70 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65  .** more efficie
29f80 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
29f90 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
29fa0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
29fb0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
29fc0 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  t must be.** inv
29fd0 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
29fe0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
29ff0 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
2a000 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
2a010 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
2a020 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
2a030 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
2a040 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
2a050 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
2a060 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
2a070 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
2a080 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
2a090 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
2a0a0 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
2a0b0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
2a0c0 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
2a0d0 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
2a0e0 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
2a0f0 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
2a100 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
2a110 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
2a120 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
2a130 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
2a140 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
2a150 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2a160 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
2a170 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
2a180 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
2a190 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
2a1a0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
2a1b0 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
2a1c0 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
2a1d0 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
2a1e0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
2a1f0 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
2a200 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2a210 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
2a220 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
2a230 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
2a240 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
2a250 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
2a260 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
2a270 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
2a280 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2a290 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
2a2a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a2b0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
2a2c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2a2d0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20   = pCur->pPage; 
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a2f0 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
2a300 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
2a310 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2a320 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a340 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
2a350 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
2a360 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2a370 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
2a380 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  EAD.  unsigned c
2a390 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66  har * const pBuf
2a3a0 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20  Start = pBuf;   
2a3b0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72    /* Start of or
2a3c0 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65  iginal out buffe
2a3d0 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  r */.#endif..  a
2a3e0 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
2a3f0 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30    assert( eOp==0
2a400 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20   || eOp==1 );.  
2a410 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a420 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a430 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2a440 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2a450 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
2a460 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2a470 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
2a480 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
2a490 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
2a4a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2a4b0 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  oad;.  assert( o
2a4c0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75  ffset+amt <= pCu
2a4d0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
2a4e0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61   );..  assert( a
2a4f0 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d  Payload > pPage-
2a500 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20  >aData );.  if( 
2a510 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20  (uptr)(aPayload 
2a520 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20  - pPage->aData) 
2a530 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  > (pBt->usableSi
2a540 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze - pCur->info.
2a550 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  nLocal) ){.    /
2a560 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
2a570 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
2a580 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
2a590 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  ta is an error. 
2a5a0 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64   The.    ** cond
2a5b0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73  itional above is
2a5c0 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20   really:.    ** 
2a5d0 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75     &aPayload[pCu
2a5e0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
2a5f0 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
2a600 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
2a610 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72  .    ** but is r
2a620 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63  ecast into its c
2a630 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61  urrent form to a
2a640 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65  void integer ove
2a650 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20  rflow problems. 
2a660 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
2a670 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a680 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
2a690 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
2a6a0 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
2a6b0 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
2a6c0 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
2a6d0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
2a6e0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
2a6f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
2a700 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
2a710 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
2a720 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2a730 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
2a740 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2a750 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
2a760 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
2a770 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
2a780 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
2a790 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
2a7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
2a7b0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
2a7c0 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
2a7d0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
2a7e0 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
2a7f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
2a800 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
2a810 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
2a820 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
2a830 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
2a840 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2a850 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
2a860 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
2a870 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
2a880 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
2a890 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
2a8a0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
2a8b0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
2a8c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2a8d0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
2a8e0 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
2a8f0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
2a900 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
2a910 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2a920 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
2a930 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e  y is sized at on
2a940 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
2a950 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
2a960 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65     ** in the ove
2a970 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
2a980 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2a990 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
2a9a0 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a  ow page is.    *
2a9b0 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  * stored in aOve
2a9c0 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41  rflow[0], etc. A
2a9d0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
2a9e0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
2a9f0 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e  rray.    ** mean
2aa00 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
2aa10 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  " (the cache is 
2aa20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
2aa30 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
2aa40 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2aa50 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
2aa60 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)==0 ){.      
2aa70 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
2aa80 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
2aa90 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
2aaa0 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
2aab0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  vflSize;.      i
2aac0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
2aad0 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ow==0.       || 
2aae0 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f  nOvfl*(int)sizeo
2aaf0 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65  f(Pgno) > sqlite
2ab00 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72  3MallocSize(pCur
2ab10 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20  ->aOverflow).   
2ab20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67     ){.        Pg
2ab30 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
2ab40 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
2ab50 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
2ab60 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
2ab70 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
2ab80 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
2ab90 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
2aba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2abb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2abc0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2abd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2abe0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
2abf0 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ow = aNew;.     
2ac00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ac10 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e     memset(pCur->
2ac20 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f  aOverflow, 0, nO
2ac30 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  vfl*sizeof(Pgno)
2ac40 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  );.      pCur->c
2ac50 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2ac60 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d  ValidOvfl;.    }
2ac70 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
2ac80 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
2ac90 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
2aca0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2acb0 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  d and the.      
2acc0 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
2acd0 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
2ace0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
2acf0 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
2ad00 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
2ad10 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  o it..      */. 
2ad20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
2ad30 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
2ad40 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
2ad50 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
2ad60 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
2ad70 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
2ad80 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
2ad90 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 20  w[iIdx];.       
2ada0 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
2adb0 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
2adc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2add0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2ade0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
2adf0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 65 78  ;.    while( nex
2ae00 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f  tPage ){.      /
2ae10 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
2ae20 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
2ae30 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
2ae40 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ache. */.      a
2ae50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76  ssert( pCur->aOv
2ae60 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a  erflow[iIdx]==0.
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2ae80 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2ae90 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
2aea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
2aeb0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
2aec0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
2aed0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
2aee0 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 69  xtPage;..      i
2aef0 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
2af00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
2af10 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
2af20 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
2af30 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
2af40 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
2af50 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
2af60 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
2af70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
2af80 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
2af90 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
2afa0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
2afb0 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
2afc0 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
2afd0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
2afe0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
2aff0 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
2b000 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
2b010 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
2b020 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
2b030 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
2b040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2b050 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2b060 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29  BTCF_ValidOvfl )
2b070 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2b080 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  ( pCur->pBtree->
2b090 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20  db==pBt->db );. 
2b0a0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
2b0b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
2b0c0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
2b0d0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
2b0e0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
2b0f0 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1];.        }els
2b100 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
2b110 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
2b120 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
2b130 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
2b140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b150 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
2b160 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
2b170 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
2b180 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
2b190 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
2b1a0 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
2b1b0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
2b1c0 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
2b1d0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
2b1e0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
2b1f0 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
2b200 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
2b210 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
2b220 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
2b230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2b240 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 2f 2a  ile *fd;      /*
2b250 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   File from which
2b260 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20 6f 76   to do direct ov
2b270 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f 0a 23  erflow read */.#
2b280 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
2b290 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
2b2a0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
2b2b0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
2b2c0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
2b2d0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
2b2e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
2b2f0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
2b300 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
2b310 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
2b320 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2b330 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
2b340 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2b350 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
2b360 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
2b370 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
2b380 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
2b390 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
2b3a0 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
2b3b0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
2b3c0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
2b3d0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
2b3e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
2b3f0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
2b400 20 20 20 34 29 20 74 68 65 20 64 61 74 61 62 61     4) the databa
2b410 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
2b420 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
2b430 2a 20 20 20 35 29 20 74 68 65 20 70 61 67 65 20  *   5) the page 
2b440 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41  is not in the WA
2b450 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  L file.        *
2b460 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73 74 20  *   6) at least 
2b470 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
2b480 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
2b490 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
2b4a0 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
2b4b0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
2b4c0 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
2b4d0 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
2b4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b4f0 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
2b500 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
2b510 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
2b520 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
2b530 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
2b540 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
2b550 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
2b560 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
2b570 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
2b580 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
2b590 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2b5a0 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20   eOp==0         
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5d0 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
2b5e0 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
2b5f0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b620 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
2b630 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
2b640 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
2b650 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
2b660 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a        /* (3) */.
2b670 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
2b680 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
2b690 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
2b6a0 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
2b6b0 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
2b6c0 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 50    && 0==sqlite3P
2b6d0 61 67 65 72 55 73 65 57 61 6c 28 70 42 74 2d 3e  agerUseWal(pBt->
2b6e0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
2b6f0 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a  )       /* (5) *
2b700 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
2b710 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
2b720 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
2b750 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2b760 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
2b770 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
2b780 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
2b790 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b7a0 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
2b7b0 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b7d0 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20   due to (6) */. 
2b7e0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2b7f0 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
2b800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2b810 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2b820 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
2b830 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
2b840 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
2b850 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
2b860 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
2b870 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
2b880 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
2b890 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
2b8a0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2b8b0 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
2b8c0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
2b8d0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
2b8e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b8f0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
2b900 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
2b910 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
2b920 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f         (eOp==0 ?
2b930 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
2b940 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
2b950 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
2b960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2b980 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
2b990 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2b9a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b9b0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
2b9c0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
2b9d0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
2b9e0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
2b9f0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
2ba00 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
2ba10 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
2ba20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ba30 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
2ba40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2ba50 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
2ba60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ba70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
2ba80 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69   -= a;.        i
2ba90 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75  f( amt==0 ) retu
2baa0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70  rn rc;.        p
2bab0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
2bac0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
2bad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49   break;.      iI
2bae0 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dx++;.    }.  }.
2baf0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bb00 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
2bb10 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  .    /* Overflow
2bb20 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d   chain ends prem
2bb30 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20 72  aturely */.    r
2bb40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2bb50 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2bb60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2bb70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
2bb80 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
2bb90 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
2bba0 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
2bbb0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
2bbc0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
2bbd0 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
2bbe0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
2bbf0 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
2bc00 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
2bc10 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
2bc20 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
2bc30 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
2bc40 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
2bc50 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
2bc60 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
2bc70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
2bc80 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
2bc90 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
2bca0 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
2bcb0 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
2bcc0 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
2bcd0 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
2bce0 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
2bcf0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
2bd00 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2bd10 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
2bd20 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
2bd30 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
2bd40 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
2bd50 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
2bd60 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
2bd70 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
2bd80 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
2bd90 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
2bda0 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
2bdb0 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
2bdc0 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
2bdd0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
2bde0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
2bdf0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
2be00 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
2be10 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
2be20 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
2be30 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
2be40 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
2be50 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
2be60 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
2be70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2be80 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
2be90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
2bea0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
2beb0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
2bec0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2bed0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2bee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bef0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2bf00 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2bf10 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2bf20 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
2bf30 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
2bf40 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
2bf50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2bf60 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
2bf70 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2bf80 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
2bf90 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
2bfa0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2bfb0 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
2bfc0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
2bfd0 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  ) works even if 
2bfe0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
2bff0 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52  ot.** in the CUR
2c000 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e  SOR_VALID state.
2c010 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65    It is only use
2c020 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
2c030 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20  _blob_read().** 
2c040 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
2c050 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c060 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69  T_INCRBLOB.stati
2c070 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2c080 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  E int accessPayl
2c090 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74  oadChecked(.  Bt
2c0a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  Cursor *pCur,.  
2c0b0 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33  u32 offset,.  u3
2c0c0 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70  2 amt,.  void *p
2c0d0 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Buf.){.  int rc;
2c0e0 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
2c0f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2c100 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
2c110 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
2c120 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
2c130 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2c140 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
2c150 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
2c160 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2c170 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  r);.  return rc 
2c180 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79  ? rc : accessPay
2c190 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
2c1a0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
2c1b0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2c1c0 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
2c1d0 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
2c1e0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
2c1f0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
2c200 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  uf){.  if( pCur-
2c210 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2c220 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2c230 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2c240 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2c250 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
2c260 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2c270 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
2c280 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f, 0);.  }else{.
2c290 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
2c2a0 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
2c2b0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
2c2c0 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  t, pBuf);.  }.}.
2c2d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2c2e0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
2c2f0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
2c300 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
2c310 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
2c320 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
2c330 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
2c340 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
2c350 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
2c360 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
2c370 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
2c380 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
2c390 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
2c3a0 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
2c3b0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
2c3c0 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
2c3d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
2c3e0 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
2c3f0 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
2c400 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
2c410 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2c420 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
2c430 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
2c440 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
2c450 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
2c460 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
2c470 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2c480 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2c490 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
2c4a0 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
2c4b0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
2c4c0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
2c4d0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
2c4e0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
2c4f0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
2c500 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
2c510 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
2c520 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
2c530 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
2c540 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
2c550 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
2c560 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
2c570 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
2c580 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
2c590 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
2c5a0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2c5b0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
2c5c0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
2c5d0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
2c5e0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
2c5f0 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
2c600 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
2c610 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
2c620 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
2c630 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
2c640 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
2c650 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
2c660 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
2c670 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
2c680 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
2c690 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
2c6a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2c6b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
2c6c0 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
2c6d0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
2c6e0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
2c6f0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
2c700 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
2c710 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
2c720 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
2c730 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
2c740 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
2c750 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
2c760 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  ){.  int amt;.  
2c770 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
2c780 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
2c790 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
2c7a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c7b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2c7c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2c7d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2c7e0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2c7f0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2c800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
2c810 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2c820 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2c830 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
2c840 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2c850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c860 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
2c870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c880 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2c890 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  >pCur->pPage->aD
2c8a0 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
2c8b0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
2c8c0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2c8d0 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad<pCur->pPage->
2c8e0 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
2c8f0 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
2c900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2c910 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e  l;.  if( amt>(in
2c920 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
2c930 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
2c940 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20  >info.pPayload) 
2c950 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
2c960 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70  is too little sp
2c970 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
2c980 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65 64  for the expected
2c990 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f   amount.    ** o
2c9a0 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e  f local content.
2c9b0 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   Database must b
2c9c0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2c9d0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
2c9e0 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20  T_DB );.    amt 
2c9f0 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70  = MAX(0, (int)(p
2ca00 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2ca10 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
2ca20 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20  o.pPayload));.  
2ca30 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32  }.  *pAmt = (u32
2ca40 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  )amt;.  return (
2ca50 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
2ca60 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
2ca70 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
2ca80 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
2ca90 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
2caa0 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
2cab0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
2cac0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
2cad0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
2cae0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
2caf0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
2cb00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
2cb10 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
2cb20 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
2cb30 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
2cb40 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
2cb50 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
2cb60 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
2cb70 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
2cb80 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
2cb90 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
2cba0 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
2cbb0 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
2cbc0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
2cbd0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
2cbe0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
2cbf0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
2cc00 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
2cc10 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
2cc20 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
2cc30 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
2cc40 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
2cc50 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
2cc60 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
2cc70 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
2cc80 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
2cc90 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
2cca0 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
2ccb0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
2ccc0 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
2ccd0 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
2cce0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
2ccf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
2cd00 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
2cd10 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
2cd20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2cd30 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
2cd40 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
2cd50 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
2cd60 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
2cd70 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
2cd80 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
2cd90 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
2cda0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2cdb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
2cdc0 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
2cdd0 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
2cde0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
2cdf0 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
2ce00 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
2ce10 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
2ce20 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
2ce30 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
2ce40 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
2ce50 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
2ce60 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
2ce70 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
2ce80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2ce90 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
2cea0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
2ceb0 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
2cec0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
2ced0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
2cee0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2cef0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2cf00 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2cf10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2cf20 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2cf30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2cf40 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
2cf50 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
2cf60 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2cf70 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
2cf80 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
2cf90 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
2cfa0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2cfb0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2cfc0 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
2cfd0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2cfe0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2cff0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2d000 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2d010 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  vfl);.  pCur->ai
2d020 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d030 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70   = pCur->ix;.  p
2d040 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d050 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
2d060 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
2d070 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2d080 69 50 61 67 65 2b 2b 3b 0a 20 20 72 63 20 3d 20  iPage++;.  rc = 
2d090 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2d0a0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
2d0b0 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20  ur->pPage,.     
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0d0 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63     pCur, pCur->c
2d0e0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20  urPagerFlags);. 
2d0f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d100 4f 4b 20 29 7b 0a 20 20 20 20 73 65 74 4d 65 6d  OK ){.    setMem
2d110 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70  pageRoot(pCur->p
2d120 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  Page, pCur->pgno
2d130 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Root);.  }.  ret
2d140 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
2d150 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2d160 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
2d170 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
2d180 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
2d190 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
2d1a0 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
2d1b0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2d1c0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2d1d0 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
2d1e0 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
2d1f0 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
2d200 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
2d210 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
2d220 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
2d230 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
2d240 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
2d250 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2d260 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
2d270 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
2d280 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2d290 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2d2a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2d2b0 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
2d2c0 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
2d2d0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
2d2e0 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
2d2f0 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
2d300 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
2d310 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d330 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
2d340 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
2d350 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
2d360 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
2d370 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
2d380 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2d390 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2d3a0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2d3b0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2d3c0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
2d3d0 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
2d3e0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2d3f0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2d400 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
2d410 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
2d420 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
2d430 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2d440 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
2d450 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2d460 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
2d470 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
2d480 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
2d490 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
2d4a0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
2d4b0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
2d4c0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
2d4d0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2d4e0 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
2d4f0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
2d500 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
2d510 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
2d520 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2d530 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
2d540 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
2d550 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
2d560 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
2d570 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
2d580 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2d590 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74  *pLeaf;.  assert
2d5a0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d5b0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d5c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2d5d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2d5e0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2d5f0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
2d600 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d610 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2d620 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
2d630 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
2d640 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2d650 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2d660 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2d670 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67   .    pCur->pPag
2d680 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  e->pgno.  );.  t
2d690 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
2d6a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d6b0 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
2d6c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2d6d0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43  ]->nCell );.  pC
2d6e0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d6f0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2d700 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2d710 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2d720 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
2d730 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  ->ix = pCur->aiI
2d740 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2d750 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75  ];.  pLeaf = pCu
2d760 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
2d770 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
2d780 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69  apPage[--pCur->i
2d790 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65  Page];.  release
2d7a0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61  PageNotNull(pLea
2d7b0 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  f);.}../*.** Mov
2d7c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2d7d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
2d7e0 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
2d7f0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
2d800 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
2d810 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
2d820 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
2d830 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
2d840 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
2d850 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
2d860 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
2d870 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
2d880 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
2d890 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
2d8a0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
2d8b0 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
2d8c0 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
2d8d0 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
2d8e0 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
2d8f0 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
2d900 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
2d910 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2d920 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
2d930 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
2d940 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
2d950 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
2d960 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2d970 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
2d980 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ID and this rout
2d990 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
2d9a0 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77  TE_EMPTY. Otherw
2d9b0 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73  ise,.** the curs
2d9c0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
2d9d0 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
2d9e0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
2d9f0 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20  the root.** (or 
2da00 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
2da10 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
2da20 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2da30 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
2da40 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
2da50 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
2da60 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
2da70 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
2da80 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
2da90 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
2daa0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
2dab0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
2dac0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
2dad0 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
2dae0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
2daf0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
2db00 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
2db10 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
2db20 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
2db30 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2db40 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
2db50 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
2db60 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
2db70 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
2db80 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
2db90 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
2dba0 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
2dbb0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2dbc0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2dbd0 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
2dbe0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
2dbf0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
2dc00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2dc10 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
2dc20 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2dc30 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
2dc40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2dc50 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2dc60 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2dc70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2dc80 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2dc90 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2dca0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2dcb0 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
2dcc0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
2dcd0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2dce0 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
2dcf0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
2dd00 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2dd10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2dd20 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e < CURSOR_REQUI
2dd30 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e  RESEEK || pCur->
2dd40 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73  iPage<0 );.  ass
2dd50 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2dd60 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69  oot>0 || pCur->i
2dd70 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28  Page<0 );..  if(
2dd80 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2dd90 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2dda0 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2ddb0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2ddc0 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ll(pCur->pPage);
2ddd0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d  .      while( --
2dde0 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
2ddf0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2de00 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2de10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2de20 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge]);.      }.  
2de30 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
2de40 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2de50 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  ];.      goto sk
2de60 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20  ip_init;.    }. 
2de70 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d   }else if( pCur-
2de80 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a  >pgnoRoot==0 ){.
2de90 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2dea0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2deb0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
2dec0 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65  LITE_EMPTY;.  }e
2ded0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2dee0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
2def0 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  1) );.    if( pC
2df00 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
2df10 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2df20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2df30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2df40 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
2df50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2df60 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
2df70 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2df80 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2df90 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2dfa0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2dfb0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
2dfc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2dfd0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2dfe0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
2dff0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2e000 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
2e010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e020 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
2e030 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2e040 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e060 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e070 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2e080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4d  ;.    }.    setM
2e0a0 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d  empageRoot(pCur-
2e0b0 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67  >pPage, pCur->pg
2e0c0 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43 75  noRoot);.    pCu
2e0d0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
2e0e0 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
2e0f0 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  y = pCur->pPage-
2e100 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
2e110 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2e120 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ge;.  assert( pR
2e130 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
2e140 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
2e150 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
2e160 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
2e170 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
2e180 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
2e190 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
2e1a0 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
2e1b0 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
2e1c0 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
2e1d0 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
2e1e0 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
2e1f0 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
2e200 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
2e210 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2e220 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
2e230 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
2e240 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
2e250 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
2e260 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2e270 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
2e280 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
2e290 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
2e2a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
2e2b0 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
2e2c0 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2e2d0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2e2e0 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
2e2f0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
2e300 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
2e310 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
2e320 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
2e330 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
2e340 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
2e350 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
2e360 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
2e370 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
2e380 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
2e390 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2e3a0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
2e3b0 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
2e3c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
2e3d0 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
2e3e0 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
2e3f0 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
2e400 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
2e410 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2e420 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67  _PAGE(pCur->pPag
2e430 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  e);.  }..skip_in
2e440 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78  it:  .  pCur->ix
2e450 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
2e460 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2e470 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e480 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2e490 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2e4a0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2e4b0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
2e4c0 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52  >pPage;.  if( pR
2e4d0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
2e4e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2e4f0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2e500 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
2e510 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
2e520 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
2e530 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
2e540 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
2e550 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2e560 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
2e570 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
2e580 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
2e590 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2e5a0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2e5b0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2e5c0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2e5d0 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
2e5e0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
2e5f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e600 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2e610 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2e620 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65  _EMPTY;.  }.  re
2e630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e640 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2e650 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
2e660 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
2e670 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2e680 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
2e690 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2e6a0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
2e6b0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
2e6c0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
2e6d0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
2e6e0 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
2e6f0 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
2e700 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2e710 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
2e720 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2e730 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2e740 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2e750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2e760 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2e770 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2e780 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2e790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e7a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2e7b0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2e7c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2e7d0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
2e7e0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2e7f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e800 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2e810 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
2e820 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
2e830 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2e840 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20  r->ix));.    rc 
2e850 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2e860 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
2e870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e880 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2e890 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2e8a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2e8b0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2e8c0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
2e8d0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2e8e0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
2e8f0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
2e900 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
2e910 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2e920 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
2e930 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
2e940 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
2e950 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
2e960 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2e970 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
2e980 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
2e990 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2e9a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2e9b0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2e9c0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
2e9d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2e9e0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
2e9f0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
2ea00 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
2ea10 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
2ea20 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2ea30 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
2ea40 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2ea50 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2ea60 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2ea70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2ea80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2ea90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2eaa0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2eab0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2eac0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ead0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2eae0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
2eaf0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
2eb00 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2eb10 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2eb20 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2eb30 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2eb40 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70      pCur->ix = p
2eb50 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2eb60 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2eb70 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2eb80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2eb90 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
2eba0 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2ebb0 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
2ebc0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2ebd0 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
2ebe0 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2ebf0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2ec00 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
2ec10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ec20 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2ec30 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
2ec40 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2ec50 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2ec60 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2ec70 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2ec80 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2ec90 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2eca0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2ecb0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2ecc0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2ecd0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2ece0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ecf0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
2ed00 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2ed10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2ed20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2ed30 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2ed40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2ed50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ed60 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2ed70 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
2ed80 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2ed90 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2eda0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2edb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2edc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2edd0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
2ede0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2edf0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2ee00 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2ee10 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2ee20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2ee30 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2ee40 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2ee50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
2ee60 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
2ee70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2ee80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ee90 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2eea0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
2eeb0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2eec0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2eed0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2eee0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2eef0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2ef00 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2ef10 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2ef20 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2ef30 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2ef40 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2ef50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
2ef60 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2ef70 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2ef80 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
2ef90 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2efa0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2efb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2efc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2efd0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2efe0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2eff0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
2f000 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
2f010 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
2f020 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
2f030 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
2f040 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
2f050 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63  tate && (pCur->c
2f060 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
2f070 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66  tLast)!=0 ){.#if
2f080 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2f090 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
2f0a0 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
2f0b0 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
2f0c0 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
2f0d0 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
2f0e0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2f0f0 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
2f100 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
2f110 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2f120 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
2f130 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2f140 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
2f150 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
2f160 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
2f170 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f180 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d   pCur->ix==pCur-
2f190 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20  >pPage->nCell-1 
2f1a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f1b0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66  Cur->pPage->leaf
2f1c0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2f1d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f1e0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2f1f0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2f200 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f210 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2f220 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2f230 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2f240 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2f250 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2f260 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2f270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
2f290 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2f2a0 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2f2b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
2f2c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2f2d0 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
2f2e0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2f2f0 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59  rc==SQLITE_EMPTY
2f300 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2f310 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2f320 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65  0 || pCur->pPage
2f330 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2f340 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2f350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f370 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2f380 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2f390 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2f3a0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2f3b0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2f3c0 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2f3d0 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2f3e0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2f3f0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2f400 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2f410 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2f420 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2f430 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2f440 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2f450 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2f460 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2f470 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2f480 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2f490 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2f4a0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2f4b0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2f4c0 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2f4d0 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2f4e0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2f4f0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2f500 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2f510 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2f520 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2f530 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2f540 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2f550 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2f560 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2f570 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2f580 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2f590 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2f5a0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2f5b0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2f5c0 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2f5d0 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2f5e0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2f5f0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2f600 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2f610 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2f620 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2f630 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2f640 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2f650 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2f660 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2f670 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2f680 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2f690 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2f6a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2f6b0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2f6c0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2f6d0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2f6e0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2f6f0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2f700 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2f710 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2f720 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2f730 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2f740 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2f750 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2f760 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2f770 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2f780 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2f790 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2f7a0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2f7b0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2f7c0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2f7d0 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2f7e0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2f7f0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2f800 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2f810 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2f820 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2f830 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2f840 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2f850 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2f860 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2f870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2f880 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2f890 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2f8a0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2f8b0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2f8c0 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2f8d0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2f8e0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2f8f0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2f900 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2f910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2f920 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2f930 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2f940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2f950 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2f960 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2f970 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2f980 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2f990 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2f9a0 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2f9b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2f9c0 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2f9d0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2f9e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2f9f0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2fa00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2fa10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2fa20 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2fa30 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2fa40 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2fa50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2fa60 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2fa70 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2fa80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2fa90 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2faa0 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b  _VALID || (pIdxK
2fab0 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63  ey==0)==(pCur->c
2fac0 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a  urIntKey!=0) );.
2fad0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2fae0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2faf0 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2fb00 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2fb10 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2fb20 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2fb30 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2fb40 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2fb50 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d  .  if( pIdxKey==
2fb60 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53  0.   && pCur->eS
2fb70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2fb80 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2fb90 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2fba0 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a  idNKey)!=0.  ){.
2fbb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2fbc0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2fbd0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2fbe0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2fbf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2fc00 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2fc10 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2fc20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
2fc30 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2fc40 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2fc50 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2fc60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72   = -1;.        r
2fc70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2fc80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
2fc90 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
2fca0 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f  ed key is one mo
2fcb0 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  re than the prev
2fcc0 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20  ious key, then. 
2fcd0 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67       ** try to g
2fce0 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20 73  et there using s
2fcf0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2fd00 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  ) rather than a 
2fd10 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69  full.      ** bi
2fd20 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54 68  nary search.  Th
2fd30 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
2fd40 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65  ation only.  The
2fd50 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a   correct answer.
2fd60 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
2fd70 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f  l obtained witho
2fd80 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e  ut this case, on
2fd90 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65  ly a little more
2fda0 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20   slowely */.    
2fdb0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2fdc0 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20  .nKey+1==intKey 
2fdd0 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65  && !pCur->skipNe
2fde0 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  xt ){.        *p
2fdf0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2fe00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2fe10 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2fe20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2fe30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe40 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49          getCellI
2fe50 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
2fe60 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2fe70 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2fe80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fe90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2feb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fec0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2fed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2fee0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2fef0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ff00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ff10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ff20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2ff30 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2ff40 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2ff50 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2ff60 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2ff70 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2ff80 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2ff90 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2ffa0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2ffb0 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2ffc0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2ffd0 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2ffe0 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2fff0 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
30000 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
30010 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
30020 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
30030 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
30040 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
30050 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
30060 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
30070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
30080 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Y ){.      asser
30090 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
300a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
300b0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
300c0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
300d0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
300e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
300f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30100 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
30110 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
30120 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
30130 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
30140 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
30150 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
30160 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
30170 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
30180 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65  ll > 0 );.  asse
30190 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
301a0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
301b0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
301c0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
301d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
301e0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
301f0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
30200 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
30210 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
30220 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
30230 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
30240 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30250 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
30260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
30280 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
30290 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
302a0 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
302b0 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
302c0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
302d0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
302e0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
302f0 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
30300 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
30310 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
30320 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
30330 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
30340 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
30350 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
30360 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
30370 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
30380 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
30390 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
303a0 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
303b0 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
303c0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
303d0 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
303e0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
303f0 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
30400 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
30410 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
30420 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
30430 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
30440 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
30450 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
30460 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
30470 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
30480 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
30490 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
304a0 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
304b0 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
304c0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
304d0 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
304e0 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
304f0 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
30500 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
30510 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
30520 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
30530 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
30540 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
30550 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
30560 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
30570 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
30580 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
30590 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
305a0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
305b0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
305c0 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  idx);.        if
305d0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
305e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
305f0 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
30600 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
30610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
30620 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
30630 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  aEnd ){.        
30640 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30650 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
30660 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
30670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30680 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30690 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
306a0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
306b0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
306c0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
306d0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
306e0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
306f0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
30700 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
30710 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
30720 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
30730 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
30740 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
30750 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
30760 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
30770 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
30780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
307a0 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
307b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
307c0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
307d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
307e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
307f0 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
30800 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
30810 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
30820 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
30830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30840 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
30850 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
30860 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20  alidNKey;.      
30870 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
30880 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
30890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
308a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
308b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
308c0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
308d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
308e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
308f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30900 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
30910 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
30920 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
30930 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
30940 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
30950 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
30960 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
30970 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
30980 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65   nCell;  /* Size
30990 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65   of the pCell ce
309a0 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ll in bytes */. 
309b0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
309c0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
309d0 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20  Page, idx);..   
309e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
309f0 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
30a00 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
30a10 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
30a20 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
30a30 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
30a40 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
30a50 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
30a60 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
30a70 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
30a80 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
30a90 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
30aa0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
30ab0 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
30ac0 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
30ad0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
30ae0 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
30af0 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
30b00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
30b10 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
30b20 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
30b30 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
30b40 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
30b50 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
30b60 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
30b70 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
30b80 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
30b90 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
30ba0 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
30bb0 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
30bc0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
30bd0 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
30be0 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
30bf0 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
30c00 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
30c10 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
30c20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
30c30 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
30c40 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
30c50 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
30c60 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
30c70 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
30c80 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
30c90 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
30ca0 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
30cb0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
30cc0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
30cd0 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
30ce0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
30cf0 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
30d00 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
30d10 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
30d20 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
30d30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
30d40 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
30d50 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
30d60 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
30d70 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
30d80 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
30d90 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
30da0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
30db0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
30dc0 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
30dd0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
30de0 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
30df0 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
30e00 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
30e10 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
30e20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
30e30 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
30e40 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
30e50 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
30e60 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
30e70 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
30e80 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
30e90 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
30ea0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
30eb0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
30ec0 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
30ed0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
30ee0 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
30ef0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
30f00 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
30f10 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
30f20 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
30f30 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
30f40 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
30f50 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
30f60 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
30f70 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
30f80 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
30f90 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
30fa0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
30fb0 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20  n be called. .  
30fc0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30fd0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72       ** If the r
30fe0 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74  ecord is corrupt
30ff0 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d  , the xRecordCom
31000 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79  pare routine may
31010 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20   read.          
31020 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72  ** up to two var
31030 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e  ints past the en
31040 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e  d of the buffer.
31050 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20   An extra 18 .  
31060 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
31070 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61   of padding is a
31080 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20  llocated at the 
31090 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
310a0 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  r in.          *
310b0 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70  * case this happ
310c0 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ens.  */.       
310d0 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
310e0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
310f0 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
31100 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
31110 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
31120 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
31130 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
31140 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
31150 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
31160 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
31170 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
31180 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Key;.          t
31190 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30  estcase( nCell<0
311a0 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66   );   /* True if
311b0 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33   key size is 2^3
311c0 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20  2 or more */.   
311d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
311e0 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a   nCell==0 );  /*
311f0 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
31200 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
31210 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  00 */.          
31220 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
31230 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =1 );  /* Invali
31240 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
31250 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20  0 0x80 0x01 */. 
31260 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31270 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20  e( nCell==2 );  
31280 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c  /* Minimum legal
31290 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20   index key size 
312a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
312b0 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20   nCell<2 ){.    
312c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
312d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
312e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
312f0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
31300 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
31310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
31320 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
31330 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
31340 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
31350 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
31360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
31370 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
31380 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
31390 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
313a0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
313b0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
313c0 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
313d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
313e0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
313f0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
31400 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
31410 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
31420 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
31430 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
31440 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20  lidOvfl;.       
31450 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31460 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31470 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
31480 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
31490 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
314a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
314b0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
314c0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
314d0 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
314e0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
314f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
31500 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
31510 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31520 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
31530 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
31540 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
31550 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
31560 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
31570 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
31580 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
31590 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
315a0 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
315b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
315c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
315d0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
315e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
315f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
31600 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
31610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
31630 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
31640 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
31650 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31660 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
31670 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
31680 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
31690 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
316a0 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
316b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
316c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
316d0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
316e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
316f0 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
31700 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
31710 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
31720 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
31730 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
31740 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
31750 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
31760 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
31770 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
31780 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
31790 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
317a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
317b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
317c0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
317d0 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
317e0 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
317f0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
31800 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
31810 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
31820 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
31830 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31840 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
31850 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
31860 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
31870 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
31880 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
31890 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
318a0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
318b0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
318c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
318d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
318e0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
318f0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
31900 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
31910 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
31920 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
31930 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
31940 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
31950 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
31960 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
31970 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
31980 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
31990 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
319a0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
319b0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
319c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
319d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
319e0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
319f0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
31a00 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
31a10 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
31a20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
31a30 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
31a40 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
31a50 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
31a60 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
31a70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
31a80 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
31a90 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
31aa0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
31ab0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
31ac0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
31ad0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
31ae0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
31af0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
31b00 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
31b10 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
31b20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
31b30 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
31b40 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
31b50 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
31b60 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
31b70 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
31b80 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
31b90 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
31ba0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
31bb0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
31bc0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
31bd0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
31be0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
31bf0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
31c00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
31c10 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68   estimate for th
31c20 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
31c30 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
31c40 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f  at pCur is.** po
31c50 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75  inting to.  Retu
31c60 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
31c70 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d  mber if no estim
31c80 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ate is currently
31c90 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a   .** available..
31ca0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
31cb0 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42  reeRowCountEst(B
31cc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
31cd0 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b    i64 n;.  u8 i;
31ce0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
31cf0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
31d00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
31d10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
31d20 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
31d30 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
31d40 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79  ..  /* Currently
31d50 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   this interface 
31d60 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
31d70 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c  y the OP_IfSmall
31d80 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20  er.  ** opcode, 
31d90 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73 65  and it that case
31da0 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
31db0 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64   always be valid
31dc0 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61   and.  ** will a
31dd0 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61  lways point to a
31de0 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20   leaf node. */. 
31df0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
31e00 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
31e10 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20  VALID) ) return 
31e20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  -1;.  if( NEVER(
31e30 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
31e40 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d  f==0) ) return -
31e50 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e  1;..  n = pCur->
31e60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
31e70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d  for(i=0; i<pCur-
31e80 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
31e90 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50    n *= pCur->apP
31ea0 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20  age[i]->nCell;. 
31eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
31ec0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
31ed0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
31ee0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
31ef0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
31f00 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a  * Return value:.
31f10 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  **.**    SQLITE_
31f20 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65 73  OK        succes
31f30 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44  s.**    SQLITE_D
31f40 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72 20  ONE      cursor 
31f50 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
31f60 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74 20  ing at the last 
31f70 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74  element.**    ot
31f80 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20 73  herwise        s
31f90 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  ome kind of erro
31fa0 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a  r occurred.**.**
31fb0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
31fc0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
31fd0 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
31fe0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
31ff0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
32000 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
32010 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
32020 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
32030 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
32040 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
32050 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
32060 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
32070 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
32080 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
32090 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
320a0 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
320b0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
320c0 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
320d0 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
320e0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
320f0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20  r..**.** If bit 
32100 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72  0x01 of the F ar
32110 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  gument in sqlite
32120 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20  3BtreeNext(C,F) 
32130 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a  is 1, then the.*
32140 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70  * cursor corresp
32150 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
32160 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
32170 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
32180 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64   been.** skipped
32190 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65   if the SQL inde
321a0 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  x had been a uni
321b0 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
321c0 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  F argument.** is
321d0 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
321e0 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74  mplement.  SQLit
321f0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
32200 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  tation does not 
32210 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74  use.** this hint
32220 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
32230 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
32240 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
32250 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
32260 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
32270 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
32280 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32290 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
322a0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
322b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
322c0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
322d0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
322e0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
322f0 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
32300 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
32310 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
32320 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
32330 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
32340 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
32350 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
32360 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
32370 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
32380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
323a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
323b0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
323c0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
323d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
323e0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20  _DONE;.    }.   
323f0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
32400 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
32410 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
32420 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
32430 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
32440 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
32450 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
32460 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
32470 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
32480 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
32490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
324a0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
324b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
324c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
324d0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
324e0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
324f0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
32500 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
32510 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69   idx = ++pCur->i
32520 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  x;.  assert( pPa
32530 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
32540 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
32550 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
32560 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
32570 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
32580 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
32590 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
325a0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
325b0 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
325c0 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
325d0 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
325e0 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
325f0 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
32600 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
32610 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
32620 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
32630 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
32640 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
32650 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
32660 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
32670 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
32680 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
32690 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
326a0 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
326b0 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78  ll );..  if( idx
326c0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
326d0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
326e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
326f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
32700 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
32710 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
32720 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
32730 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
32740 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
32750 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65       return move
32760 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
32770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
32780 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
32790 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
327a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
327b0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
327c0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
327d0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
327e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
327f0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
32800 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
32810 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
32820 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78  }while( pCur->ix
32830 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
32840 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
32850 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
32860 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
32870 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
32880 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
32890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
328a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
328b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
328c0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
328d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
328e0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
328f0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
32900 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
32910 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
32920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
32930 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65  int flags){.  Me
32940 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
32950 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32960 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55  ( flags );  /* U
32970 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75  sed in COMDB2 bu
32980 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c  t not native SQL
32990 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ite */.  assert(
329a0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
329b0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
329c0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
329d0 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20  || flags==1 );. 
329e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
329f0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
32a00 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
32a10 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
32a20 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
32a30 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
32a40 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
32a50 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
32a60 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
32a70 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
32a80 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
32a90 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
32aa0 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
32ab0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66  Cur->pPage;.  if
32ac0 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d  ( (++pCur->ix)>=
32ad0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
32ae0 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a      pCur->ix--;.
32af0 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
32b00 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Next(pCur);.  }.
32b10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
32b20 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
32b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
32b40 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
32b50 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
32b60 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
32b70 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
32b80 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
32b90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
32ba0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
32bb0 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76  ase..** Return v
32bc0 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
32bd0 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73   SQLITE_OK     s
32be0 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51  uccess.**     SQ
32bf0 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20  LITE_DONE   the 
32c00 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
32c10 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65  y on the first e
32c20 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
32c30 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72  ble.**     other
32c40 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69  wise     some ki
32c50 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75  nd of error occu
32c60 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  rred.**.** The m
32c70 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
32c80 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
32c90 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
32ca0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
32cb0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
32cc0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
32cd0 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
32ce0 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
32cf0 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
32d00 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
32d10 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
32d20 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
32d30 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
32d40 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a  treePrevious().*
32d50 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  * helper routine
32d60 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
32d70 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
32d80 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
32d90 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f  ferent page.** o
32da0 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  r to restore the
32db0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
32dc0 66 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68  f bit 0x01 of th
32dd0 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  e F argument to 
32de0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
32df0 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20  ious(C,F) is 1, 
32e00 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73  then.** the curs
32e10 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  or corresponds t
32e20 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
32e30 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
32e40 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a  could have been.
32e50 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  ** skipped if th
32e60 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  e SQL index had 
32e70 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e  been a unique in
32e80 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75  dex.  The F argu
32e90 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e  ment is a.** hin
32ea0 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
32eb0 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  nt.  The native 
32ec0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
32ed0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
32ee0 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73   not.** use this
32ef0 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42   hint, but COMDB
32f00 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  2 does..*/.stati
32f10 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
32f20 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
32f30 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
32f40 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
32f50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
32f60 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
32f70 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
32f80 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
32f90 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
32fa0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
32fb0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
32fc0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  D );.  assert( (
32fd0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
32fe0 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
32ff0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
33000 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
33010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
33020 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
33030 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
33040 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
33050 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
33060 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
33070 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
33080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
330a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
330b0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
330c0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
330d0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ate ){.      ret
330e0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
330f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
33100 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
33110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33120 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
33130 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
33140 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
33150 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
33160 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
33170 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
33180 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
33190 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
331a0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
331b0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
331c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
331d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
331e0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
331f0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
33200 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
33210 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
33220 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
33230 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
33240 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
33250 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78  t idx = pCur->ix
33260 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
33270 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
33280 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
33290 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
332a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
332b0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
332c0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
332d0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
332e0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
332f0 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ix==0 ){.      i
33300 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
33310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
33320 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
33330 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
33340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33350 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
33360 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
33370 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
33380 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
33390 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
333a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
333b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
333c0 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   (BTCF_ValidOvfl
333d0 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
333e0 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50  ur->ix--;.    pP
333f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
33400 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
33410 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
33420 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
33430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
33440 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
33450 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
33460 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
33470 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
33480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33490 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
334a0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
334b0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
334c0 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  gs){.  assert( c
334d0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
334e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
334f0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
33500 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61   flags==1 );.  a
33510 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
33520 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
33530 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
33540 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53  _VALID );.  UNUS
33550 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c  ED_PARAMETER( fl
33560 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20  ags );  /* Used 
33570 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f  in COMDB2 but no
33580 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  t native SQLite 
33590 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  */.  pCur->curFl
335a0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
335b0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
335c0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
335d0 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
335e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
335f0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
33600 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
33610 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a   || pCur->ix==0.
33620 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67     || pCur->pPag
33630 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  e->leaf==0.  ){.
33640 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
33650 50 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a  Previous(pCur);.
33660 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d    }.  pCur->ix--
33670 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
33680 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
33690 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
336a0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
336b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
336c0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
336d0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
336e0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
336f0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
33700 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
33710 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
33720 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
33730 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
33740 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
33750 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
33760 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
33770 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
33780 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
33790 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
337a0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
337b0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
337c0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
337d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
337e0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
337f0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
33800 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
33810 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
33820 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74    *ppPage is set
33830 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
33840 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
33850 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
33860 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
33870 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
33880 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
33890 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
338a0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
338b0 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
338c0 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
338d0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
338e0 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
338f0 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
33900 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
33910 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
33920 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
33930 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
33940 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
33950 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
33960 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
33970 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
33980 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
33990 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
339a0 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
339b0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
339c0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
339d0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
339e0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
339f0 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
33a00 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
33a10 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
33a20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
33a30 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
33a40 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
33a50 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
33a60 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
33a70 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
33a80 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
33a90 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
33aa0 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
33ab0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
33ac0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
33ad0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
33ae0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
33af0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
33b00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
33b10 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
33b20 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
33b30 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
33b40 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
33b50 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
33b60 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
33b70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
33b80 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
33b90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
33ba0 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
33bb0 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
33bc0 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
33bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
33be0 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
33bf0 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
33c00 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
33c10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
33c20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
33c30 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
33c40 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
33c50 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
33c60 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
33c70 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
33c80 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
33c90 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
33ca0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
33cb0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
33cc0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
33cd0 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
33ce0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
33cf0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
33d00 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
33d10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
33d20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
33d30 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
33d40 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
33d50 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30  ANY || (nearby>0
33d60 20 26 26 20 52 45 51 55 49 52 45 5f 50 54 52 4d   && REQUIRE_PTRM
33d70 41 50 20 29 20 29 3b 0a 20 20 70 50 61 67 65 31  AP ) );.  pPage1
33d80 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
33d90 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
33da0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
33db0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
33dc0 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20  : R-05119-02637 
33dd0 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
33de0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
33df0 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20   offset 36.  ** 
33e00 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68  stores stores th
33e10 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
33e20 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
33e30 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20  reelist. */.  n 
33e40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
33e50 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
33e60 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
33e70 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
33e80 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30   ISCONCURRENT==0
33e90 20 26 26 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b   && n>=mxPage ){
33ea0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33eb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33ec0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  .  }..  /* Ensur
33ed0 65 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  e page 1 is writ
33ee0 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
33ef0 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68 65 72 20  ion will either 
33f00 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
33f10 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 73 20  r.  ** of pages 
33f20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
33f30 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
33f40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33f50 65 2e 20 53 69 6e 63 65 20 62 6f 74 68 0a 20 20  e. Since both.  
33f60 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f 70 65 72  ** of these oper
33f70 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d  ations involve m
33f80 6f 64 69 66 79 69 6e 67 20 70 61 67 65 20 31 20  odifying page 1 
33f90 68 65 61 64 65 72 20 66 69 65 6c 64 73 2c 20 70  header fields, p
33fa0 61 67 65 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20  age 1.  ** will 
33fb0 64 65 66 69 6e 69 74 65 6c 79 20 62 65 20 77 72  definitely be wr
33fc0 69 74 74 65 6e 20 62 79 20 74 68 69 73 20 74 72  itten by this tr
33fd0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33fe0 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52  is is an CONCURR
33ff0 45 4e 54 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ENT.  ** transac
34000 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20 74 68 65  tion, ensure the
34010 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
34020 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 20  ucture has been 
34030 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
34040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34050 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
34060 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
34070 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34080 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
34090 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
340a0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
340b0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
340c0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
340d0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
340e0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
340f0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
34100 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
34110 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
34120 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
34130 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
34140 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
34150 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
34160 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
34170 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
34180 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
34190 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
341a0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
341b0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
341c0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
341d0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
341e0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
341f0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
34200 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
34210 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
34220 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
34230 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
34240 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
34250 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
34260 20 20 20 20 61 73 73 65 72 74 28 20 49 53 41 55      assert( ISAU
34270 54 4f 56 41 43 55 55 4d 21 3d 49 53 43 4f 4e 43  TOVACUUM!=ISCONC
34280 55 52 52 45 4e 54 20 29 3b 0a 20 20 20 20 20 20  URRENT );.      
34290 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
342a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
342b0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
342c0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
342d0 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
342e0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
342f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
34300 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
34310 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
34320 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
34330 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
34340 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
34350 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
34360 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
34370 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
34380 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
34390 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 61  .            sea
343a0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
343b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
343c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
343d0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
343e0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
343f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d      }else if( eM
34400 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
34410 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c  ){.      searchL
34420 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ist = 1;.    }..
34430 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
34440 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
34450 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
34460 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
34470 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
34480 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
34490 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
344a0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
344b0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
344c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
344d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
344e0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
344f0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
34500 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
34510 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
34520 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
34530 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
34540 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
34550 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
34560 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
34570 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
34580 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
34590 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
345a0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
345b0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
345c0 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
345d0 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
345e0 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
345f0 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
34600 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
34610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
34620 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
34630 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
34640 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
34650 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
34660 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
34670 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
34680 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
34690 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
346a0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
346b0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
346c0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
346d0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
346e0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
346f0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
34700 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
34710 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
34720 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
34730 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
34740 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
34750 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
34760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34770 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
34780 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
34790 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
347a0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
347b0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
347c0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
347d0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
347e0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
347f0 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
34800 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
34810 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
34820 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
34830 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
34840 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
34850 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
34860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34870 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
34880 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
34890 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
348a0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
348b0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
348c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
348d0 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
348e0 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
348f0 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
34900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34910 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
34920 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
34930 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
34940 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
34950 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34960 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
34970 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
34980 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
34990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
349a0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
349b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
349c0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
349d0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
349e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
349f0 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
34a00 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
34a10 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34a20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
34a30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
34a40 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
34a50 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
34a60 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
34a70 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
34a80 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
34a90 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
34aa0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
34ab0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
34ac0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
34ad0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
34ae0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
34af0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
34b00 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
34b10 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
34b20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
34b30 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
34b40 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
34b50 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
34b60 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
34b70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
34b80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34b90 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
34ba0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
34bb0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
34bc0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
34bd0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
34be0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
34bf0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
34c00 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
34c10 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
34c20 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
34c30 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
34c40 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
34c50 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
34c60 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
34c70 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
34c80 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
34c90 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
34ca0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
34cb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
34cc0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
34cd0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
34ce0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
34cf0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
34d00 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
34d10 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
34d20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34d30 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
34d40 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
34d50 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
34d60 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
34d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34d80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
34d90 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
34da0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
34db0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
34dc0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
34dd0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
34de0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
34df0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
34e00 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
34e10 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
34e20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
34e30 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
34e40 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
34e50 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
34e60 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
34e70 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
34e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
34e90 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
34ea0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
34eb0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
34ec0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
34ed0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34ee0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
34ef0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
34f00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
34f10 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
34f20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
34f30 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
34f40 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
34f50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
34f60 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
34f70 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
34f80 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
34f90 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
34fa0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
34fb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34fc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
34fd0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34fe0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
34ff0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35020 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
35030 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35040 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35050 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
35060 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
35070 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
35080 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
35090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
350a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
350b0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
350c0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
350d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
350e0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
350f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
35100 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
35110 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
35120 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
35130 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
35140 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
35150 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
35160 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
35170 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
35180 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
35190 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
351a0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
351b0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
351c0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
351d0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
351e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
351f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
35200 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
35210 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
35220 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
35230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35240 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35250 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
35260 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
35270 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
35280 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
35290 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
352a0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
352b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
352c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
352d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
352e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
352f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35310 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
35320 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
35330 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
35340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35350 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
35360 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
35370 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
35380 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
35390 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
353a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
353b0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
353c0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
353d0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
353e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
353f0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
35400 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
35410 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
35420 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
35430 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
35440 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
35450 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
35460 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
35470 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
35480 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
35490 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
354a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
354b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
354c0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
354d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
354e0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
354f0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
35500 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
35510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35530 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
35540 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
35550 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
35560 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
35570 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
35580 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
35590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
355a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
355b0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
355c0 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
355d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
355e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
355f0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
35600 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
35610 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
35620 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
35630 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
35640 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
35650 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
35660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
35670 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
35680 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
35690 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
356a0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
356b0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
356c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
356d0 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
356e0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
356f0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
35700 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
35710 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
35720 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
35730 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
35740 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
35750 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
35760 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
35770 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
35780 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
35790 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
357a0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
357b0 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
357c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
357d0 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
357e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
357f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
35800 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
35810 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
35820 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
35830 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
35840 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
35850 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
35860 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
35870 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
35880 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
35890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
358a0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
358b0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
358c0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
358d0 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
358e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
358f0 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
35900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
35910 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
35920 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
35930 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
35940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
35960 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35970 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
35980 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
35990 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
359a0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
359b0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
359c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
359d0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
359e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
359f0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
35a00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
35a10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
35a20 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
35a30 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
35a40 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35a60 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
35a70 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
35a80 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
35a90 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
35aa0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
35ab0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
35ac0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
35ad0 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
35ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
35af0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
35b00 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
35b10 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
35b20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
35b30 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
35b40 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
35b50 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
35b60 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
35b70 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
35b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b90 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
35ba0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
35bb0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
35bc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35bd0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
35be0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
35bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
35c00 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
35c10 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
35c20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
35c30 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
35c40 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
35c50 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
35c60 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
35c70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35c80 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
35c90 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
35ca0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
35cb0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
35cc0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
35cd0 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
35ce0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
35cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
35d00 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
35d10 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
35d20 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
35d30 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
35d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35d60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35d70 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
35d80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
35d90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35db0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
35dc0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
35dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
35de0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
35df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35e00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35e10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
35e20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35e30 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
35e40 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
35e50 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
35e60 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
35e70 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
35e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
35e90 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
35ea0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
35eb0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
35ec0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
35ed0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
35ee0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
35ef0 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
35f00 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
35f10 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
35f20 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
35f30 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
35f40 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
35f50 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
35f60 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
35f70 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
35f80 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
35f90 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
35fa0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
35fb0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
35fc0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
35fd0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
35fe0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
35ff0 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
36000 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
36010 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
36020 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
36030 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
36040 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
36050 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
36060 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
36070 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
36080 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
36090 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
360a0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
360b0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
360c0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
360d0 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
360e0 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
360f0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
36100 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
36110 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
36120 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
36130 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
36140 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
36150 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
36160 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
36170 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
36180 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
36190 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
361a0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
361b0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
361c0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
361d0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
361e0 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
361f0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
36200 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
36210 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
36220 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
36230 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
36240 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
36250 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
36260 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
36270 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
36280 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36290 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
362a0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
362b0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
362c0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
362d0 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
362e0 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
362f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36300 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
36310 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
36320 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
36330 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
36340 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
36350 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
36360 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
36370 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
36380 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
36390 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
363a0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
363b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
363c0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
363d0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
363e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
363f0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
36400 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
36410 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
36420 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
36430 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
36440 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
36450 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
36460 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
36470 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
36480 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
36490 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
364a0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
364b0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
364c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
364d0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
364e0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
364f0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
36500 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
36510 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
36520 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
36530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
36540 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
36550 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36560 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
36570 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
36580 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
36590 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
365a0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
365b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
365c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
365d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
365e0 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
365f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
36600 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
36610 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
36620 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36630 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
36640 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
36650 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
36660 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
36670 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
36680 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
36690 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
366a0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
366b0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
366c0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
366d0 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
366e0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
366f0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
36700 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
36710 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
36720 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
36730 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
36740 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
36750 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36760 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
36770 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
36780 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
36790 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
367a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
367b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
367c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
367d0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
367e0 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
367f0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
36800 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
36810 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
36820 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
36830 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
36840 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
36850 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
36860 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
36870 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
36880 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
36890 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
368a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
368b0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
368c0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
368d0 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
368e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
368f0 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
36900 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
36910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36920 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
36930 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
36940 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
36950 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
36960 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
36970 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
36980 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
36990 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
369a0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
369b0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
369c0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
369d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
369e0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
369f0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
36a00 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
36a10 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
36a20 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
36a30 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
36a40 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
36a50 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
36a60 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
36a70 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
36a80 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
36a90 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
36aa0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
36ab0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
36ac0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
36ad0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
36ae0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
36af0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
36b00 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
36b10 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
36b20 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
36b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
36b40 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
36b50 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
36b60 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
36b70 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
36b80 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36ba0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
36bb0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
36bc0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
36bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36be0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
36bf0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
36c00 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
36c10 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
36c20 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
36c30 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
36c40 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
36c50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
36c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36c70 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
36c80 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
36c90 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
36ca0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
36cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cc0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
36cd0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
36d00 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
36d10 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
36d20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
36d30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36d40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
36d50 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
36d60 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
36d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
36d80 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
36d90 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
36da0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
36db0 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
36dc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36dd0 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
36de0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
36df0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
36e00 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
36e10 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
36e20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
36e30 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
36e40 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
36e50 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
36e60 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
36e70 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
36e80 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
36e90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
36ea0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
36eb0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
36ec0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
36ed0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
36ee0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
36ef0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
36f00 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
36f10 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
36f20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
36f30 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
36f40 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
36f50 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
36f60 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
36f70 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
36f80 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
36f90 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
36fa0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
36fb0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
36fc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
36fd0 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
36fe0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
36ff0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
37000 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
37010 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
37020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37030 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
37040 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
37050 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
37060 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
37070 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
37080 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
37090 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
370a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
370b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
370c0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
370d0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
370e0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
370f0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
37100 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
37110 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
37120 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52 45 5f  /.  if( REQUIRE_
37130 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20 70 74  PTRMAP ){.    pt
37140 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
37150 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
37160 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
37170 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
37180 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
37190 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
371a0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
371b0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
371c0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
371d0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
371e0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
371f0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
37200 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
37210 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
37220 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
37230 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
37240 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
37250 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
37260 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
37270 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
37280 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
37290 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
372a0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
372b0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
372c0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
372d0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
372e0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
372f0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
37300 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
37310 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
37320 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
37330 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
37340 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
37350 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
37360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37370 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
37380 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
37390 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
373a0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
373b0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
373c0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
373d0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
373e0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
373f0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
37400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37410 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
37420 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
37430 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
37440 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
37450 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
37460 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
37470 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
37480 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
37490 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
374a0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
374b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
374c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
374d0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
374e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
374f0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
37500 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
37510 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
37520 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
37530 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
37540 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
37550 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
37560 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
37570 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
37580 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
37590 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
375a0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
375b0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
375c0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
375d0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
375e0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
375f0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
37600 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
37610 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
37620 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
37630 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
37640 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
37650 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
37660 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
37670 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
37680 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
37690 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
376a0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
376b0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
376c0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
376d0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
376e0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
376f0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
37700 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
37710 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
37720 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
37730 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
37740 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
37750 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
37760 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
37770 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
37780 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
37790 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
377a0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
377b0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
377c0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
377d0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
377e0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
377f0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
37800 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
37810 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
37820 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
37830 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
37840 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
37850 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
37860 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
37870 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
37880 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
37890 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
378a0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
378b0 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
378c0 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
378d0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
378e0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
378f0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
37900 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
37910 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
37920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
37930 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
37940 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
37950 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
37960 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
37970 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
37980 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
37990 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
379a0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
379b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
379c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
379d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
379e0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
379f0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
37a00 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
37a10 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
37a20 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
37a30 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
37a40 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
37a50 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
37a60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
37a70 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
37a80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37a90 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
37aa0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
37ab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
37ac0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
37ad0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
37ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37af0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
37b00 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
37b10 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
37b20 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
37b30 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
37b40 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
37b50 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
37b60 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
37b70 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
37b80 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
37b90 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
37ba0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
37bb0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
37bc0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
37bd0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
37be0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
37bf0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
37c00 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
37c10 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
37c20 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
37c30 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
37c40 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
37c50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
37c60 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
37c70 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
37c80 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
37c90 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
37ca0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
37cb0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
37cc0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
37cd0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
37ce0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
37cf0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
37d00 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
37d10 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
37d20 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
37d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37d40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
37d50 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
37d60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37d70 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
37d80 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
37d90 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
37da0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
37db0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
37dc0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
37dd0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
37de0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
37df0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
37e00 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
37e10 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
37e20 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
37e30 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
37e40 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
37e50 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
37e60 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
37e70 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
37e80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
37e90 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
37ea0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
37eb0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
37ec0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
37ed0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
37ee0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
37ef0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
37f00 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
37f10 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
37f20 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
37f30 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
37f40 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
37f50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
37f60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37f70 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
37f80 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69   Store.** size i
37f90 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
37fa0 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e   the cell in pIn
37fb0 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  fo..*/.static in
37fc0 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
37fd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
37fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
37ff0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
38000 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
38010 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
38020 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
38030 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
38040 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  ll */.  CellInfo
38050 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
38060 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61   /* Size informa
38070 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
38080 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ell */.){.  BtSh
38090 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e  ared *pBt;.  Pgn
380a0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
380b0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
380c0 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
380d0 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
380e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
380f0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
38100 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
38110 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
38120 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
38130 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  fo);.  if( pInfo
38140 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d  ->nLocal==pInfo-
38150 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  >nPayload ){.   
38160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38170 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
38180 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
38190 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
381a0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
381b0 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f   if( pCell+pInfo
381c0 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67  ->nSize-1 > pPag
381d0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
381e0 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
381f0 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
38200 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
38210 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
38220 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
38230 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
38240 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
38250 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
38260 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
38270 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
38280 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  Bt;.  assert( pB
38290 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
382a0 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
382b0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
382c0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
382d0 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  fl = (pInfo->nPa
382e0 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e  yload - pInfo->n
382f0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
38300 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
38310 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
38320 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
38330 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
38340 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
38350 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
38360 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
38370 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
38380 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
38390 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
383a0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
383b0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
383c0 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
383d0 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
383e0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
383f0 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
38400 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
38410 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
38420 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
38430 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
38440 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
38450 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
38460 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
38470 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
38480 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
38490 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
384a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3