/ Hex Artifact Content
Login

Artifact 8872dcc869d648ccc0b95834fc7e81cf49c456f7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
3a80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
3a90: 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ENT./*.** The fo
3aa0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ab0: 65 20 2d 20 42 74 72 65 65 50 74 72 6d 61 70 20  e - BtreePtrmap 
3ac0: 2d 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 2d  - stores the in-
3ad0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 6d  memory pointer m
3ae0: 61 70 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 6e  ap.** used for n
3af0: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
3b00: 61 67 65 73 20 69 6e 20 43 4f 4e 43 55 52 52 45  ages in CONCURRE
3b10: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  NT transactions.
3b20: 20 53 75 63 68 20 70 61 67 65 73 20 61 72 65 0a   Such pages are.
3b30: 2a 2a 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ** always alloca
3b40: 74 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  ted in a contigu
3b50: 6f 75 73 20 62 6c 6f 63 6b 20 28 66 72 6f 6d 20  ous block (from 
3b60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
3b70: 69 6c 65 29 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile) starting.**
3b80: 20 77 69 74 68 20 70 61 67 65 20 42 74 72 65 65   with page Btree
3b90: 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2e 0a 2a  Ptrmap.iFirst..*
3ba0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
3bb0: 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 52   RollbackEntry R
3bc0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 3b 0a 74 79  ollbackEntry;.ty
3bd0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 74 72  pedef struct Ptr
3be0: 6d 61 70 45 6e 74 72 79 20 50 74 72 6d 61 70 45  mapEntry PtrmapE
3bf0: 6e 74 72 79 3b 0a 73 74 72 75 63 74 20 50 74 72  ntry;.struct Ptr
3c00: 6d 61 70 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e  mapEntry {.  Pgn
3c10: 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38 20 65  o parent;.  u8 e
3c20: 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20  Type;.};.struct 
3c30: 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 7b 0a  RollbackEntry {.
3c40: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 50    Pgno pgno;.  P
3c50: 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38  gno parent;.  u8
3c60: 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63   eType;.};.struc
3c70: 74 20 42 74 72 65 65 50 74 72 6d 61 70 20 7b 0a  t BtreePtrmap {.
3c80: 20 20 50 67 6e 6f 20 69 46 69 72 73 74 3b 20 20    Pgno iFirst;  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 2f 2a 20 46 69 72 73 74 20 6e 65 77 20 70    /* First new p
3cb0: 61 67 65 20 6e 75 6d 62 65 72 20 61 50 74 72 5b  age number aPtr[
3cc0: 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 74  0] */..  int nPt
3cd0: 72 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  rAlloc;         
3ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3cf0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 50  cated size of aP
3d00: 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  tr[] array */.  
3d10: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 50 74  PtrmapEntry *aPt
3d20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3d30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 61 72 65  /* Array of pare
3d40: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  nt page numbers 
3d50: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 76 70 74 3b  */..  int nSvpt;
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69        /* Used si
3d80: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 61 72  ze of aSvpt[] ar
3d90: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 76  ray */.  int nSv
3da0: 70 74 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  ptAlloc;        
3db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3dc0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 53  cated size of aS
3dd0: 76 70 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a  vpt[] */.  int *
3de0: 61 53 76 70 74 3b 20 20 20 20 20 20 20 20 20 20  aSvpt;          
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3e00: 72 73 74 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20  rst aRollback[] 
3e10: 65 6e 74 72 79 20 66 6f 72 20 73 61 76 65 70 6f  entry for savepo
3e20: 69 6e 74 20 69 20 2a 2f 0a 0a 20 20 69 6e 74 20  int i */..  int 
3e30: 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  nRollback;      
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3e50: 73 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c  sed size of aRol
3e60: 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f  lback[] array */
3e70: 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b  .  int nRollback
3e80: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
3e90: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3ea0: 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63  size of aRollbac
3eb0: 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 52  k[] array */.  R
3ec0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 52  ollbackEntry *aR
3ed0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 2f  ollback;       /
3ee0: 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6c 6c 62  * Array of rollb
3ef0: 61 63 6b 20 65 6e 74 72 69 65 73 20 2a 2f 0a 7d  ack entries */.}
3f00: 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  ;../* !defined(S
3f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
3f20: 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 49 66 20  RRENT).**.** If 
3f30: 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
3f40: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
3f50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 42 74 72   or equal to Btr
3f60: 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2c  eePtrmap.iFirst,
3f70: 20 0a 2a 2a 20 73 74 6f 72 65 20 61 6e 20 65 6e   .** store an en
3f80: 74 72 79 20 66 6f 72 20 69 74 20 69 6e 20 74 68  try for it in th
3f90: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 74  e pointer-map st
3fa0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3fb0: 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d  ic int btreePtrm
3fc0: 61 70 53 74 6f 72 65 28 0a 20 20 42 74 53 68 61  apStore(.  BtSha
3fd0: 72 65 64 20 2a 70 42 74 2c 0a 20 20 50 67 6e 6f  red *pBt,.  Pgno
3fe0: 20 70 67 6e 6f 2c 0a 20 20 75 38 20 65 54 79 70   pgno,.  u8 eTyp
3ff0: 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e  e, .  Pgno paren
4000: 74 0a 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d  t.){.  BtreePtrm
4010: 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
4020: 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 67 6e 6f  pMap;.  if( pgno
4030: 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 29  >=pMap->iFirst )
4040: 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e 74 72 79  {.    int iEntry
4050: 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e   = pgno - pMap->
4060: 69 46 69 72 73 74 3b 0a 0a 20 20 20 20 2f 2a 20  iFirst;..    /* 
4070: 47 72 6f 77 20 74 68 65 20 61 50 74 72 5b 5d 20  Grow the aPtr[] 
4080: 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65  array as require
4090: 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  d */.    while( 
40a0: 69 45 6e 74 72 79 3e 3d 70 4d 61 70 2d 3e 6e 50  iEntry>=pMap->nP
40b0: 74 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  trAlloc ){.     
40c0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70   int nNew = pMap
40d0: 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f 20 70 4d  ->nPtrAlloc ? pM
40e0: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 2a 32 20  ap->nPtrAlloc*2 
40f0: 3a 20 31 36 3b 0a 20 20 20 20 20 20 50 74 72 6d  : 16;.      Ptrm
4100: 61 70 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20  apEntry *aNew = 
4110: 28 50 74 72 6d 61 70 45 6e 74 72 79 2a 29 73 71  (PtrmapEntry*)sq
4120: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
4130: 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61           pMap->a
4140: 50 74 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  Ptr, nNew*sizeof
4150: 28 50 74 72 6d 61 70 45 6e 74 72 79 29 0a 20 20  (PtrmapEntry).  
4160: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
4170: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
4180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4190: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
41a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
41b0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 4e 65 77 2d  t nByte = (nNew-
41c0: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29  pMap->nPtrAlloc)
41d0: 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e  *sizeof(PtrmapEn
41e0: 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  try);.        me
41f0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4d 61 70 2d  mset(&aNew[pMap-
4200: 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20 30 2c 20  >nPtrAlloc], 0, 
4210: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
4220: 70 4d 61 70 2d 3e 61 50 74 72 20 3d 20 61 4e 65  pMap->aPtr = aNe
4230: 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d  w;.        pMap-
4240: 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d 20 6e 4e 65  >nPtrAlloc = nNe
4250: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
4260: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
4270: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 72 6f 6c  entry to the rol
4280: 6c 62 61 63 6b 20 6c 6f 67 20 69 66 20 72 65 71  lback log if req
4290: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
42a0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 3e 30 20 26   pMap->nSvpt>0 &
42b0: 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e  & pMap->aPtr[iEn
42c0: 74 72 79 5d 2e 70 61 72 65 6e 74 20 29 7b 0a 20  try].parent ){. 
42d0: 20 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e       if( pMap->n
42e0: 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61 70 2d 3e  Rollback>=pMap->
42f0: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 29  nRollbackAlloc )
4300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e  {.        int nN
4310: 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c  ew = pMap->nRoll
4320: 62 61 63 6b 20 3f 20 70 4d 61 70 2d 3e 6e 52 6f  back ? pMap->nRo
4330: 6c 6c 62 61 63 6b 2a 32 20 3a 20 31 36 3b 0a 20  llback*2 : 16;. 
4340: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4350: 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20 28 52 6f  ntry *aNew = (Ro
4360: 6c 6c 62 61 63 6b 45 6e 74 72 79 2a 29 73 71 6c  llbackEntry*)sql
4370: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
4380: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4390: 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e 65 77 2a  aRollback, nNew*
43a0: 73 69 7a 65 6f 66 28 52 6f 6c 6c 62 61 63 6b 45  sizeof(RollbackE
43b0: 6e 74 72 79 29 0a 20 20 20 20 20 20 20 20 29 3b  ntry).        );
43c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
43d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
43e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
43f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
4400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4410: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 20  pMap->aRollback 
4420: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
4430: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4440: 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  kAlloc = nNew;. 
4450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4460: 0a 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52  ..      pMap->aR
4470: 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52  ollback[pMap->nR
4480: 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f 20 3d 20  ollback].pgno = 
4490: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 4d 61 70  pgno;.      pMap
44a0: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70  ->aRollback[pMap
44b0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 61 72  ->nRollback].par
44c0: 65 6e 74 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72  ent = pMap->aPtr
44d0: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 3b  [iEntry].parent;
44e0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
44f0: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
4500: 6c 6c 62 61 63 6b 5d 2e 65 54 79 70 65 20 3d 20  llback].eType = 
4510: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4520: 79 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 7d 0a  y].eType;.    }.
4530: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
4540: 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20  he aPtr[] array 
4550: 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50 74  */.    pMap->aPt
4560: 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74  r[iEntry].parent
4570: 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 70   = parent;.    p
4580: 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79  Map->aPtr[iEntry
4590: 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b  ].eType = eType;
45a0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
45b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
45c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
45d0: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29  OMIT_CONCURRENT)
45e0: 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76 65  .**.** Open save
45f0: 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
4600: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4610: 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f 0a  lready open..*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4630: 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53 68  PtrmapBegin(BtSh
4640: 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 6e  ared *pBt, int n
4650: 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50 74  Svpt){.  BtreePt
4660: 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74  rmap *pMap = pBt
4670: 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d  ->pMap;.  if( pM
4680: 61 70 20 26 26 20 6e 53 76 70 74 3c 70 4d 61 70  ap && nSvpt<pMap
4690: 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20 69  ->nSvpt ){.    i
46a0: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 53  nt i;.    if( nS
46b0: 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70 74  vpt>=pMap->nSvpt
46c0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
46d0: 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e  nt nNew = pMap->
46e0: 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d 61  nSvptAlloc ? pMa
46f0: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32 20  p->nSvptAlloc*2 
4700: 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74 20  : 16;.      int 
4710: 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *aNew = sqlite3_
4720: 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61 53  realloc(pMap->aS
4730: 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  vpt, sizeof(int)
4740: 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20   * nNew);.      
4750: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
4760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4770: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4790: 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20 61   pMap->aSvpt = a
47a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  New;.        pMa
47b0: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d 20  p->nSvptAlloc = 
47c0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
47d0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 70    }..    for(i=p
47e0: 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e 53  Map->nSvpt; i<nS
47f0: 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vpt; i++){.     
4800: 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d 20   pMap->aSvpt[i] 
4810: 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  = pMap->nRollbac
4820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 61  k;.    }.    pMa
4830: 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70 74  p->nSvpt = nSvpt
4840: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4860: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4870: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
4880: 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ).**.** Rollback
4890: 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49   (if op==SAVEPOI
48a0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72 20  NT_ROLLBACK) or 
48b0: 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d 3d  release (if op==
48c0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
48d0: 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  E).** savepoint 
48e0: 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  iSvpt..*/.static
48f0: 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d 61   void btreePtrma
4900: 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a 70  pEnd(BtShared *p
4910: 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  Bt, int op, int 
4920: 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  iSvpt){.  BtreeP
4930: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4940: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4950: 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Map ){.    asser
4960: 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
4970: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d  _ROLLBACK || op=
4980: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4990: 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  SE );.    assert
49a0: 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28 69  ( iSvpt>=0 || (i
49b0: 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  Svpt==-1 && op==
49c0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
49d0: 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 69  CK) );.    if( i
49e0: 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Svpt<0 ){.      
49f0: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b  pMap->nSvpt = 0;
4a00: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f  .      pMap->nRo
4a10: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
4a20: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e 61    memset(pMap->a
4a30: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Ptr, 0, sizeof(P
4a40: 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50 74  gno) * pMap->nPt
4a50: 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65 6c  rAlloc);.    }el
4a60: 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d 61  se if( iSvpt<pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
4a90: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
4aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
4ab0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 70          for(ii=p
4ac0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31  Map->nRollback-1
4ad0: 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76 70  ; ii>=pMap->aSvp
4ae0: 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29 7b  t[iSvpt]; ii--){
4af0: 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c 62  .          Rollb
4b00: 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26 70  ackEntry *p = &p
4b10: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69  Map->aRollback[i
4b20: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50 74  i];.          Pt
4b30: 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72  rmapEntry *pEntr
4b40: 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b  y = &pMap->aPtr[
4b50: 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e  p->pgno - pMap->
4b60: 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20  iFirst];.       
4b70: 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e     pEntry->paren
4b80: 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20  t = p->parent;. 
4b90: 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d           pEntry-
4ba0: 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
4bb0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
4bc0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70 2d     }.      pMap-
4bd0: 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20 2b  >nSvpt = iSvpt +
4be0: 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
4bf0: 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
4c00: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
4c10: 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69   = pMap->aSvpt[i
4c20: 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Svpt];.    }.  }
4c30: 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
4c40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
4c50: 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68  URRENT).**.** Th
4c60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4c70: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 43  alled after an C
4c80: 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
4c90: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20  ction is opened 
4ca0: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
4cb0: 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65 73  se. It allocates
4cc0: 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70   the BtreePtrmap
4cd0: 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64 20   structure used 
4ce0: 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65 72  to track pointer
4cf0: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  s.** to allocate
4d00: 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72 6f  d pages and zero
4d10: 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54 72  es the nFree/iTr
4d20: 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74 68  unk fields in th
4d30: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
4d40: 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31 2e  eader on page 1.
4d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4d60: 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61  treePtrmapAlloca
4d70: 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  te(BtShared *pBt
4d80: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4d90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
4da0: 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a 20  Bt->pMap==0 ){. 
4db0: 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a     BtreePtrmap *
4dc0: 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMap = sqlite3_m
4dd0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72  alloc(sizeof(Btr
4de0: 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20 20  eePtrmap));.    
4df0: 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a 20  if( pMap==0 ){. 
4e00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4e10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
4e20: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
4e30: 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
4e40: 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a 65  ata[32], 0, size
4e50: 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20 20  of(u32)*2);.    
4e60: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20 30    memset(pMap, 0
4e70: 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74  , sizeof(BtreePt
4e80: 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70 4d  rmap));.      pM
4e90: 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42 74  ap->iFirst = pBt
4ea0: 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20 20  ->nPage + 1;.   
4eb0: 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20 70     pBt->pMap = p
4ec0: 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Map;.    }.  }. 
4ed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4ee0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4ef0: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4f00: 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  T).**.** Free an
4f10: 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74  y BtreePtrmap st
4f20: 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65  ructure allocate
4f30: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
4f40: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65 65  call to.** btree
4f50: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 29  PtrmapAllocate()
4f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4f70: 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65   btreePtrmapDele
4f80: 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  te(BtShared *pBt
4f90: 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  ){.  BtreePtrmap
4fa0: 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
4fb0: 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29  ap;.  if( pMap )
4fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4fd0: 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61  ee(pMap->aRollba
4fe0: 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ck);.    sqlite3
4ff0: 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74 72  _free(pMap->aPtr
5000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5010: 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74 29  ree(pMap->aSvpt)
5020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
5030: 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70 42  ee(pMap);.    pB
5040: 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20 7d  t->pMap = 0;.  }
5050: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51 4c  .}.#else  /* SQL
5060: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
5070: 45 4e 54 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  ENT */.# define 
5080: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5090: 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  ate(x) SQLITE_OK
50a0: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
50b0: 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20 0a  trmapDelete(x) .
50c0: 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74  # define btreePt
50d0: 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20 20  rmapBegin(x,y)  
50e0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
50f0: 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e  ne btreePtrmapEn
5100: 64 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  d(x,y,z) .#endif
5110: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5120: 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 73  CONCURRENT */..s
5130: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5140: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
5150: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
5160: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5170: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
5180: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5190: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
51a0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
51b0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
51c0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
51d0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
51e0: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
51f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
5210: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
5220: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
5230: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
5240: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
5250: 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72  utex);.}../* Ver
5260: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
5270: 73 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68  sor and the BtSh
5280: 61 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74  ared agree about
5290: 20 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72   what is the cur
52a0: 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
52b0: 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73   connetion. This
52c0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
52d0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
52e0: 64 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62  de. If the datab
52f0: 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ase .** connecti
5300: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20  on pointers get 
5310: 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20  out-of-sync, it 
5320: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
5330: 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a  routines like.**
5340: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
5350: 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
5360: 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f   stale connectio
5370: 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72  n pointer that r
5380: 65 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61  eferences a.** a
5390: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
53a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f   has already clo
53b0: 73 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  sed.  This routi
53c0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
53d0: 65 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  e assert().** st
53e0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e  atements only an
53f0: 64 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  d for the purpos
5400: 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63  e of double-chec
5410: 6b 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74  king that the bt
5420: 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73  ree code.** does
5430: 20 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61   keep the databa
5440: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f  se connection po
5450: 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74  inters up-to-dat
5460: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5470: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
5480: 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29  red(BtCursor *p)
5490: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
54a0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  orHoldsMutex(p) 
54b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
54c0: 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70  pBtree->db==p->p
54d0: 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69  Bt->db);.}.#endi
54e0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  f../*.** Invalid
54f0: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
5500: 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
5510: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5520: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5530: 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  t..** on the sha
5540: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5550: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66  ure pBt..*/.#def
5560: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
5570: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
5580: 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ) (pCur->curFlag
5590: 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
55a0: 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  Ovfl)../*.** Inv
55b0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
55c0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
55d0: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
55e0: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
55f0: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
5600: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
5610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5620: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
5630: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
5640: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
5650: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5660: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5670: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5680: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
5690: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
56a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
56b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
56c0: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
56d0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
56e0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
56f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5700: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
5710: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
5720: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
5730: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e  a table.** to in
5740: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
5750: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68  rblob cursors th
5760: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  at are open on t
5770: 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65  he.** row or one
5780: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69   of the rows bei
5790: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
57a0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69  ** If argument i
57b0: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74  sClearTable is t
57c0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  rue, then the en
57d0: 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
57e0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73   the.** table is
57f0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
5800: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
5810: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  se invalidate al
5820: 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75  l incrblob.** cu
5830: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  rsors open on an
5840: 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65  y row within the
5850: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5860: 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  -page pgnoRoot..
5870: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
5880: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   if argument isC
5890: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c  learTable is fal
58a0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  se, then the row
58b0: 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69   with.** rowid i
58c0: 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70  Row is being rep
58d0: 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64  laced or deleted
58e0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
58f0: 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c  nvalidate.** onl
5900: 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62  y those incrblob
5910: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
5920: 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72   that specific r
5930: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
5940: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  id invalidateInc
5950: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20  rblobCursors(.  
5960: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
5970: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5980: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
5990: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69  check */.  i64 i
59a0: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
59b0: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
59c0: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
59d0: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
59e0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
59f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
5a00: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
5a10: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
5a20: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5a30: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
5a40: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
5a50: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
5a60: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
5a70: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
5a80: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
5a90: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
5aa0: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
5ab0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
5ac0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5ad0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
5ae0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
5af0: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
5b00: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
5b10: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
5b20: 20 20 20 20 20 69 66 28 20 69 73 43 6c 65 61 72       if( isClear
5b30: 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f  Table || p->info
5b40: 2e 6e 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20  .nKey==iRow ){. 
5b50: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
5b60: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
5b70: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
5b80: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
5b90: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
5ba0: 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69   when INCRBLOB i
5bb0: 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23  s omitted */.  #
5bc0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
5bd0: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
5be0: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
5bf0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
5c00: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
5c10: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
5c20: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
5c30: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
5c40: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
5c50: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
5c60: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
5c70: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
5c80: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
5c90: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
5ca0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
5cb0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
5cc0: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
5cd0: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
5ce0: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
5cf0: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
5d00: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
5d10: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
5d20: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
5d30: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
5d40: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
5d50: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
5d60: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
5d70: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
5d80: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
5d90: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
5da0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
5db0: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
5dc0: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
5dd0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
5de0: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
5df0: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
5e00: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
5e10: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
5e20: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
5e30: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
5e40: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
5e50: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
5e60: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
5e70: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
5e80: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
5e90: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
5ea0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
5eb0: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
5ec0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
5ed0: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
5ee0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
5ef0: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
5f00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5f10: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
5f20: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
5f30: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
5f40: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
5f50: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
5f60: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
5f70: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
5f80: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
5f90: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
5fa0: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
5fb0: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
5fc0: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
5fd0: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
5fe0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
5ff0: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
6000: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
6010: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
6020: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
6030: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
6040: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
6050: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
6060: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
6070: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
6080: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
6090: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
60a0: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
60b0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
60c0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
60d0: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
60e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
60f0: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
6100: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
6110: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
6120: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
6130: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
6140: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
6150: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
6160: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
6170: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
6180: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
6190: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
61a0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
61b0: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
61c0: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
61d0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
61e0: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
61f0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
6200: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
6210: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
6220: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
6230: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
6240: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
6250: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
6260: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
6270: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
6280: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
6290: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
62a0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
62b0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
62c0: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
62d0: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
62e0: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
62f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6300: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
6310: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
6320: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6330: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
6340: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6350: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
6360: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
6370: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
6380: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
6390: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
63a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
63b0: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
63c0: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
63d0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
63e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
63f0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
6400: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
6410: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e  SQLITE_OK && pgn
6420: 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  o<=sqlite3Bitvec
6430: 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f  Size(pBt->pHasCo
6440: 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63  ntent) ){.    rc
6450: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
6460: 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  Set(pBt->pHasCon
6470: 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  tent, pgno);.  }
6480: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6490: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65  ./*.** Query the
64a0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
64b0: 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a  ntent vector..**
64c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
64d0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
64e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
64f0: 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65  f page is remove
6500: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72  d from the.** fr
6510: 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73  ee-list for reus
6520: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61  e. It returns fa
6530: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66  lse if it is saf
6540: 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  e to retrieve th
6550: 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74  e.** page from t
6560: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  he pager layer w
6570: 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
6580: 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
6590: 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  rue otherwise..*
65a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
65b0: 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
65c0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
65d0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74  gno pgno){.  Bit
65e0: 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48  vec *p = pBt->pH
65f0: 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74  asContent;.  ret
6600: 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e  urn (p && (pgno>
6610: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
6620: 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42  e(p) || sqlite3B
6630: 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e  itvecTest(p, pgn
6640: 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  o)));.}../*.** C
6650: 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74  lear (destroy) t
6660: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
6670: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
6680: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a  This should be.*
6690: 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  * invoked at the
66a0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65   conclusion of e
66b0: 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ach write-transa
66c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
66d0: 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72   void btreeClear
66e0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
66f0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
6700: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
6710: 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  y(pBt->pHasConte
6720: 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73  nt);.  pBt->pHas
6730: 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  Content = 0;.}..
6740: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
6750: 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b  l of the apPage[
6760: 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63 75  ] pages for a cu
6770: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
6780: 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61 73  void btreeReleas
6790: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
67a0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
67b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
67c0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
67d0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  age; i++){.    r
67e0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
67f0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
6800: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
6810: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72   = 0;.  }.  pCur
6820: 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a  ->iPage = -1;.}.
6830: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
6840: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
6850: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75  only argument mu
6860: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  st point to a va
6870: 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65  lid entry.** whe
6880: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
6890: 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20  is called (i.e. 
68a0: 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52  have eState==CUR
68b0: 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73  SOR_VALID). This
68c0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76  .** function sav
68d0: 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
68e0: 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72  ursor key in var
68f0: 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65  iables pCur->nKe
6900: 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70  y and.** pCur->p
6910: 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  Key. SQLITE_OK i
6920: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
6930: 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53  ccessful or an S
6940: 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20  QLite error .** 
6950: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
6960: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
6970: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
6980: 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n intkey table, 
6990: 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72  then the integer
69a0: 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77   key.** (the row
69b0: 69 64 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e  id) is stored in
69c0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20   pCur->nKey and 
69d0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65  pCur->pKey is le
69e0: 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c  ft set to.** NUL
69f0: 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  L. If the cursor
6a00: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f   is open on a no
6a10: 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n-intkey table, 
6a20: 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20  then pCur->pKey 
6a30: 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f  is .** set to po
6a40: 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65  int to a malloce
6a50: 64 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e  d buffer pCur->n
6a60: 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  Key bytes in siz
6a70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  e containing .**
6a80: 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61   the key..*/.sta
6a90: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
6aa0: 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  orKey(BtCursor *
6ab0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  pCur){.  int rc 
6ac0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
6ad0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
6ae0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
6af0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
6b00: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
6b10: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6b20: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6b30: 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   );..  if( pCur-
6b40: 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20  >curIntKey ){.  
6b50: 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f    /* Only the ro
6b60: 77 69 64 20 69 73 20 72 65 71 75 69 72 65 64 20  wid is required 
6b70: 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65  for a table btre
6b80: 65 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e  e */.    pCur->n
6b90: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
6ba0: 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 75  eeIntegerKey(pCu
6bb0: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
6bc0: 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78   /* For an index
6bd0: 20 62 74 72 65 65 2c 20 73 61 76 65 20 74 68 65   btree, save the
6be0: 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f   complete key co
6bf0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69  ntent */.    voi
6c00: 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 70 43 75  d *pKey;.    pCu
6c10: 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65  r->nKey = sqlite
6c20: 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
6c30: 65 28 70 43 75 72 29 3b 0a 20 20 20 20 70 4b 65  e(pCur);.    pKe
6c40: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
6c50: 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b  c( pCur->nKey );
6c60: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
6c70: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6c80: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
6c90: 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e  , 0, (int)pCur->
6ca0: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20  nKey, pKey);.   
6cb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6cc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6cd0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65  pCur->pKey = pKe
6ce0: 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
6cf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6d00: 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  free(pKey);.    
6d10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6d20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6d30: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
6d40: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
6d50: 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65   !pCur->curIntKe
6d60: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
6d70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
6d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
6d90: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6da0: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
6db0: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
6dc0: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
6dd0: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
6de0: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
6df0: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
6e00: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6e10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
6e20: 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
6e30: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
6e40: 73 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74  s valid (has eSt
6e50: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6e60: 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  D).** prior to c
6e70: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
6e80: 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ine.  .*/.static
6e90: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
6ea0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
6eb0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6ec0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
6ed0: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
6ee0: 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53  ->eState || CURS
6ef0: 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75  OR_SKIPNEXT==pCu
6f00: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61  r->eState );.  a
6f10: 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e  ssert( 0==pCur->
6f20: 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  pKey );.  assert
6f30: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
6f40: 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69  ex(pCur) );..  i
6f50: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
6f60: 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
6f70: 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
6f80: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
6f90: 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LID;.  }else{.  
6fa0: 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
6fb0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20   = 0;.  }..  rc 
6fc0: 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28  = saveCursorKey(
6fd0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
6fe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6ff0: 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
7000: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75  lCursorPages(pCu
7010: 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  r);.    pCur->eS
7020: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
7030: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
7040: 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
7050: 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
7060: 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
7070: 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29  vfl|BTCF_AtLast)
7080: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7090: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
70a0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
70b0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
70c0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
70d0: 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a  OnList(BtCursor*
70e0: 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29  ,Pgno,BtCursor*)
70f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  ;../*.** Save th
7100: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
7110: 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65  ll cursors (exce
7120: 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74  pt pExcept) that
7130: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20   are open on.** 
7140: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
7150: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
7160: 20 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72   "Saving the cur
7170: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65  sor position" me
7180: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ans that.** the 
7190: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
71a0: 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65  btree is remembe
71b0: 72 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61  red in such a wa
71c0: 79 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  y that it can be
71d0: 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74  .** moved back t
71e0: 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20  o the same spot 
71f0: 61 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20  after the btree 
7200: 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
7210: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
7220: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  ine is called ju
7230: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
7240: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
7250: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a   to modify the.*
7260: 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61  * table, for exa
7270: 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c  mple in BtreeDel
7280: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
7290: 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  sert()..**.** If
72a0: 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
72b0: 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
72c0: 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
72d0: 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20  , then all such 
72e0: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75  .** cursors shou
72f0: 6c 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54  ld have their BT
7300: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
7310: 20 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65   set.  The btree
7320: 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74  Cursor().** rout
7330: 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61  ine enforces tha
7340: 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f  t rule.  This ro
7350: 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73  utine only needs
7360: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   to be called in
7370: 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e  .** the uncommon
7380: 20 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65   case when pExpe
7390: 63 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f  ct has the BTCF_
73a0: 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
73b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  t..**.** If pExp
73c0: 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66  ect!=NULL and if
73d0: 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72   no other cursor
73e0: 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74  s are found on t
73f0: 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67  he same root-pag
7400: 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42  e,.** then the B
7410: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
7420: 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20  g on pExpect is 
7430: 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69  cleared, to avoi
7440: 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69  d another.** poi
7450: 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74  ntless call to t
7460: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
7470: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
7480: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
7490: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
74a0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
74b0: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
74c0: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
74d0: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
74e0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
74f0: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
7500: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
7510: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
7520: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
7530: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
7540: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
7550: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
7560: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
7570: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
7580: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
7590: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
75a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
75b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
75c0: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
75d0: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
75e0: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
75f0: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
7600: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
7610: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
7620: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
7630: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
7640: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
7650: 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72  .  }.  if( p ) r
7660: 65 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72  eturn saveCursor
7670: 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74  sOnList(p, iRoot
7680: 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66  , pExcept);.  if
7690: 28 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63  ( pExcept ) pExc
76a0: 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  ept->curFlags &=
76b0: 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b   ~BTCF_Multiple;
76c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
76d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20  _OK;.}../* This 
76e0: 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74  helper routine t
76f0: 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  o saveAllCursors
7700: 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c   does the actual
7710: 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a   work of saving.
7720: 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69  ** the cursors i
7730: 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72  f and when a cur
7740: 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61  sor is found tha
7750: 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69  t actually requi
7760: 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54  res saving..** T
7770: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69  he common case i
7780: 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72  s that no cursor
7790: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  s need to be sav
77a0: 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ed, so this rout
77b0: 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e  ine is.** broken
77c0: 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61   out from its ca
77d0: 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e  ller to avoid un
77e0: 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20  necessary stack 
77f0: 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74  pointer movement
7800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7810: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
7820: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
7830: 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
7840: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
7850: 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68   first cursor th
7860: 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20  at needs saving 
7870: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
7880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c            /* Onl
7890: 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69  y save cursor wi
78a0: 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53  th this iRoot. S
78b0: 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20  ave all if zero 
78c0: 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
78d0: 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20  Except    /* Do 
78e0: 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75  not save this cu
78f0: 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b  rsor */.){.  do{
7900: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
7910: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
7920: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
7930: 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20  =iRoot) ){.     
7940: 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d   if( p->eState==
7950: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
7960: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
7970: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
7980: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
7990: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
79a0: 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  n(p);.        if
79b0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
79c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
79d0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
79e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
79f0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
7a00: 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20   p->iPage>0 );. 
7a10: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
7a20: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
7a30: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
7a40: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
7a50: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
7a60: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
7a70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7a80: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
7a90: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
7aa0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7ab0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
7ac0: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
7ad0: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
7ae0: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
7af0: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
7b00: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
7b10: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
7b20: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
7b30: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7b40: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
7b50: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
7b60: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
7b70: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
7b80: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
7b90: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
7ba0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
7bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
7bc0: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
7bd0: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
7be0: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
7bf0: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
7c00: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
7c10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
7c20: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
7c30: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
7c40: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
7c50: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
7c60: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
7c70: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7c80: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
7c90: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
7ca0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
7cb0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
7cc0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
7cd0: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
7ce0: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
7cf0: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
7d00: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
7d10: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
7d20: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
7d30: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
7d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
7d50: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
7d60: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
7d70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
7d90: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
7da0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
7db0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
7dc0: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
7dd0: 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b  /.  char aSpace[
7de0: 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  200];          /
7df0: 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72  * Temp space for
7e00: 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76   pIdxKey - to av
7e10: 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a  oid a malloc */.
7e20: 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20    char *pFree = 
7e30: 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  0;..  if( pKey )
7e40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  {.    assert( nK
7e50: 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b  ey==(i64)(int)nK
7e60: 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  ey );.    pIdxKe
7e70: 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  y = sqlite3VdbeA
7e80: 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
7e90: 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75 72  rd(.        pCur
7ea0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61  ->pKeyInfo, aSpa
7eb0: 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
7ec0: 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29  e), &pFree.    )
7ed0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
7ee0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
7ef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
7f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7f10: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
7f20: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
7f30: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
7f40: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
7f50: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
7f60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
7f70: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
7f80: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
7f90: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
7fa0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7fb0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
7fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
7fd0: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
7fe0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
7ff0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
8000: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
8010: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
8020: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
8030: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8040: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
8050: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
8060: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8070: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
8080: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
8090: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
80a0: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
80b0: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
80c0: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
80d0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
80e0: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
80f0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
8100: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
8110: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
8120: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
8130: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
8140: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
8150: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
8160: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
8170: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
8180: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
8190: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
81a0: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
81b0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
81c0: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
81d0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
81e0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
81f0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
8200: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
8210: 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
8220: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
8230: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
8240: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
8250: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
8260: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
8270: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
8280: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
8290: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
82a0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
82b0: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
82c0: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
82d0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
82e0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
82f0: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
8300: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8310: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8320: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
8330: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
8340: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
8350: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
8360: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
8370: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8380: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
8390: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
83a0: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
83b0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
83c0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
83d0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
83e0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
83f0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
8400: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
8410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8420: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
8430: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
8440: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
8450: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
8460: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
8470: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
8480: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8490: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
84a0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
84b0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
84c0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
84d0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
84e0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
84f0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
8500: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
8510: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
8520: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
8530: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
8540: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
8550: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
8560: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
8570: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
8580: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
8590: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
85a0: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
85b0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
85c0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
85d0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
85e0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
85f0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
8600: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
8610: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
8620: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
8630: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
8640: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
8650: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
8660: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
8670: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
8680: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
8690: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
86a0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
86b0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
86c0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
86d0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
86e0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
86f0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
8700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8710: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
8720: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
8730: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
8740: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
8750: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
8760: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
8770: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
8780: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
8790: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
87a0: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
87b0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
87c0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
87d0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
87e0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
87f0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
8800: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
8810: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
8820: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
8830: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
8840: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
8850: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
8860: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
8870: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
8880: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
8890: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
88a0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
88b0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
88c0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
88d0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
88e0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
88f0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
8900: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
8910: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
8920: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
8930: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
8940: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
8950: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
8960: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
8970: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
8980: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
8990: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
89a0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
89b0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
89c0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
89d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
89e0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
89f0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
8a00: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
8a10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8a20: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
8a30: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
8a40: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
8a50: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65  entRow = 1;.  }e
8a60: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
8a70: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
8a80: 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66  =0 );.    *pDiff
8a90: 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20  erentRow = 0;.  
8aa0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8ab0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
8ac0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
8ad0: 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a  RSOR_HINTS./*.**
8ae0: 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74   Provide hints t
8af0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  o the cursor.  T
8b00: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68 69  he particular hi
8b10: 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68  nt given (and th
8b20: 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75  e type.** and nu
8b30: 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72 61  mber of the vara
8b40: 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29 20  rgs parameters) 
8b50: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
8b60: 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a   the eHintType.*
8b70: 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65  * parameter.  Se
8b80: 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  e the definition
8b90: 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48  s of the BTREE_H
8ba0: 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72  INT_* macros for
8bb0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69   details..*/.voi
8bc0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
8bd0: 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f  rsorHint(BtCurso
8be0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69  r *pCur, int eHi
8bf0: 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20  ntType, ...){.  
8c00: 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20  /* Used only by 
8c10: 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62 73  system that subs
8c20: 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e  titute their own
8c30: 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20   storage engine 
8c40: 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.}.#endif../*.
8c50: 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20  ** Provide flag 
8c60: 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72  hints to the cur
8c70: 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sor..*/.void sql
8c80: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
8c90: 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f  intFlags(BtCurso
8ca0: 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65  r *pCur, unsigne
8cb0: 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20  d x){.  assert( 
8cc0: 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51  x==BTREE_SEEK_EQ
8cd0: 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c   || x==BTREE_BUL
8ce0: 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b  KLOAD || x==0 );
8cf0: 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d  .  pCur->hints =
8d00: 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20   x;.}...#ifndef 
8d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8d20: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
8d30: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
8d40: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
8d50: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
8d60: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
8d70: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
8d80: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
8d90: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
8da0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
8db0: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
8dc0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mber..**.** Retu
8dd0: 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69  rn 0 (not a vali
8de0: 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f  d page) for pgno
8df0: 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20  ==1 since there 
8e00: 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72  is.** no pointer
8e10: 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20   map associated 
8e20: 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68  with page 1.  Th
8e30: 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e integrity_chec
8e40: 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69  k logic.** requi
8e50: 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50  res that ptrmapP
8e60: 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a  ageno(*,1)!=1..*
8e70: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
8e80: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
8e90: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
8ea0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
8eb0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
8ec0: 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65  Pgno iPtrMap, re
8ed0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
8ee0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8ef0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8f00: 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65   if( pgno<2 ) re
8f10: 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73  turn 0;.  nPages
8f20: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
8f30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
8f40: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
8f50: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
8f60: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
8f70: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
8f80: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
8f90: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
8fa0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
8fb0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
8fc0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
8fd0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
8fe0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
8ff0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
9000: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
9010: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
9020: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
9030: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
9040: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
9050: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
9060: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
9070: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
9080: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a  mber 'pgno'..**.
9090: 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e  ** If *pRC is in
90a0: 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f  itially non-zero
90b0: 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29   (non-SQLITE_OK)
90c0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
90d0: 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  ne is.** a no-op
90e0: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
90f0: 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f  ccurs, the appro
9100: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
9110: 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  e is written.** 
9120: 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74  into *pRC..*/.st
9130: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
9140: 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Put(BtShared *pB
9150: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
9160: 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65  eType, Pgno pare
9170: 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  nt, int *pRC){. 
9180: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
9190: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
91a0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
91b0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
91c0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
91d0: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
91e0: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
91f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
9200: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
9210: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
9220: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9230: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
9240: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
9250: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
9260: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
9270: 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
9280: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
9290: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
92a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
92b0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
92c0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74  );.  /* The mast
92d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er-journal page 
92e0: 6e 75 6d 62 65 72 20 69 73 20 6e 65 76 65 72 20  number is never 
92f0: 61 64 64 65 64 20 74 6f 20 61 20 70 6f 69 6e 74  added to a point
9300: 65 72 2d 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er-map page */. 
9310: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
9320: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
9330: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
9340: 28 70 42 74 29 29 20 29 3b 0a 0a 23 69 66 6e 64  (pBt)) );..#ifnd
9350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9360: 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20  ONCURRENT.  if( 
9370: 70 42 74 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20  pBt->pMap ){.   
9380: 20 2a 70 52 43 20 3d 20 62 74 72 65 65 50 74 72   *pRC = btreePtr
9390: 6d 61 70 53 74 6f 72 65 28 70 42 74 2c 20 6b 65  mapStore(pBt, ke
93a0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
93b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
93c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
93d0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
93e0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
93f0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
9400: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
9410: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
9420: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
9430: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
9440: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
9450: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9460: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
9470: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
9480: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
9490: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
94a0: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
94b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
94c0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
94d0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
94e0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
94f0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
9500: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
9510: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
9520: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
9530: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
9540: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
9550: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
9560: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
9570: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
9580: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
9590: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
95a0: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
95b0: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
95c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
95d0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
95e0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
95f0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
9600: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
9610: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
9620: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
9630: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
9640: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
9650: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9660: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
9670: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
9680: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
9690: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
96a0: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
96b0: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
96c0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
96d0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
96e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
96f0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
9700: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
9710: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9720: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
9730: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
9740: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
9750: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
9760: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
9770: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
9780: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
9790: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
97a0: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
97b0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
97c0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
97d0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
97e0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
97f0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
9800: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
9810: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
9820: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
9830: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
9840: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
9850: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
9860: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
9870: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
9880: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
9890: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
98a0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
98b0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
98c0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
98d0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
98e0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
98f0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
9900: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
9910: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9920: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
9930: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
9940: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
9950: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
9960: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
9970: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
9980: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
9990: 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  DbPage, 0);.  if
99a0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
99b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
99c0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
99d0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
99e0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
99f0: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
9a00: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
9a10: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
9a20: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
9a30: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
9a40: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
9a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9a60: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9a70: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9a80: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
9a90: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
9aa0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
9ab0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
9ac0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
9ad0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
9ae0: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
9af0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
9b00: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
9b10: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
9b20: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
9b30: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
9b40: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
9b50: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9b60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9b70: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
9b80: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
9b90: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9ba0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
9bb0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
9bc0: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
9bd0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
9be0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
9bf0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
9c00: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
9c10: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
9c20: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
9c30: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
9c40: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
9c50: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
9c60: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
9c70: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
9c80: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
9c90: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
9ca0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
9cb0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
9cc0: 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  * findCellPastPt
9cd0: 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d  r() does the sam
9ce0: 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70  e except it skip
9cf0: 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69  s past the initi
9d00: 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69  al.** 4-byte chi
9d10: 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64  ld pointer found
9d20: 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   on interior pag
9d30: 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  es, if there is 
9d40: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  one..**.** This 
9d50: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
9d60: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
9d70: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
9d80: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
9d90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
9da0: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
9db0: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
9dc0: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
9dd0: 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50  2byteAligned(&(P
9de0: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
9df0: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
9e00: 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c  ndCellPastPtr(P,
9e10: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
9e20: 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d  taOfst + ((P)->m
9e30: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
9e40: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
9e50: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
9e60: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
9e70: 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70  is common tail p
9e80: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74  rocessing for bt
9e90: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
9ea0: 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61  ) and.** btreePa
9eb0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9ec0: 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  ) for the case w
9ed0: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65  hen the cell doe
9ee0: 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65  s not fit entire
9ef0: 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c  ly.** on a singl
9f00: 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20  e B-tree page.  
9f10: 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61  Make necessary a
9f20: 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68  djustments to th
9f30: 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74  e CellInfo.** st
9f40: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
9f50: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
9f60: 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  NE void btreePar
9f70: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9f80: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d  ForOverflow(.  M
9f90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9fa0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9fb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9fc0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9fd0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9fe0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9ff0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
a000: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
a010: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
a020: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
a030: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49  ure */.){.  /* I
a040: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
a050: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
a060: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
a070: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
a080: 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20  .  ** to decide 
a090: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
a0a0: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
a0b0: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
a0c0: 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c  onto.  ** overfl
a0d0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
a0e0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
a0f0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
a100: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a  t of unused.  **
a110: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
a120: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
a130: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
a140: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
a150: 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  ge.  ** in betwe
a160: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
a170: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20  maxLocal..  **. 
a180: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
a190: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
a1a0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
a1b0: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
a1c0: 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77  n any.  ** way w
a1d0: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
a1e0: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
a1f0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a  le format..  */.
a200: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
a210: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
a220: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
a230: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
a240: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
a250: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
a260: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
a270: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
a280: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
a290: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
a2a0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
a2b0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
a2c0: 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  .  minLocal = pP
a2d0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
a2e0: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
a2f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73  e->maxLocal;.  s
a300: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
a310: 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79  l + (pInfo->nPay
a320: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
a330: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
a340: 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74  ableSize-4);.  t
a350: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
a360: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
a370: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
a380: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  s==maxLocal+1 );
a390: 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c  .  if( surplus <
a3a0: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
a3b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
a3c0: 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a  = (u16)surplus;.
a3d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
a3e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
a3f0: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  6)minLocal;.  }.
a400: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a410: 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70   (u16)(&pInfo->p
a420: 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e  Payload[pInfo->n
a430: 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20  Local] - pCell) 
a440: 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 4;.}../*.** Th
a450: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a460: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
a470: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
a480: 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65  MemPage.xParseCe
a490: 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  ll().** method..
a4a0: 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  **.** Parse a ce
a4b0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
a4c0: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
a4d0: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
a4e0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65  ure..**.** btree
a4f0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20  ParseCellPtr()  
a500: 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65        =>   table
a510: 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65   btree leaf node
a520: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
a530: 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  ellNoPayload()  
a540: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
a550: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a   internal nodes.
a560: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
a570: 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e  lPtrIndex()   =>
a580: 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e     index btree n
a590: 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  odes.**.** There
a5a0: 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70   is also a wrapp
a5b0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65  er function btre
a5c0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61  eParseCell() tha
a5d0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61  t works for.** a
a5e0: 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73  ll MemPage types
a5f0: 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72 65   and that refere
a600: 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79  nces the cell by
a610: 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74 68   index rather th
a620: 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72  an.** by pointer
a630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a640: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
a650: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d  trNoPayload(.  M
a660: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
a670: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
a680: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
a690: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
a6a0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
a6b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
a6c0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
a6d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
a6e0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
a6f0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
a700: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ure */.){.  asse
a710: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a720: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a730: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a740: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
a750: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
a760: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
a770: 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66  trSize==4 );.#if
a780: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
a790: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
a7a0: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
a7b0: 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  dif.  pInfo->nSi
a7c0: 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69  ze = 4 + getVari
a7d0: 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75  nt(&pCell[4], (u
a7e0: 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  64*)&pInfo->nKey
a7f0: 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  );.  pInfo->nPay
a800: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66  load = 0;.  pInf
a810: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
a820: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
a830: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
a840: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a850: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
a860: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a870: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a880: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a890: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
a8a0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
a8b0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
a8c0: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
a8d0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
a8e0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
a8f0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
a900: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
a910: 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  u8 *pIter;      
a920: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
a930: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
a940: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e  pCell */.  u32 n
a950: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
a960: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a970: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
a980: 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69  yload */.  u64 i
a990: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
a9a0: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20     /* Extracted 
a9b0: 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  Key value */..  
a9c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a9d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
a9e0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
a9f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
aa00: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
aa10: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
aa20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
aa30: 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20  intKeyLeaf );.  
aa40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
aa50: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29  hildPtrSize==0 )
aa60: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
aa70: 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  l;..  /* The nex
aa80: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
aa90: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
aaa0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
aab0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
aac0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79  nt32(pIter, nPay
aad0: 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  load);.  **.  **
aae0: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
aaf0: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
ab00: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
ab10: 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
ab20: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
ab30: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
ab40: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
ab50: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
ab60: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
ab70: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
ab80: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
ab90: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
aba0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
abb0: 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72   }while( (*pIter
abc0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
abd0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
abe0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  Iter++;..  /* Th
abf0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
ac00: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
ac10: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
ac20: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
ac30: 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28  tVarint(pIter, (
ac40: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
ac50: 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  y);.  **.  ** Th
ac60: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
ac70: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
ac80: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
ac90: 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72  .  iKey = *pIter
aca0: 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78  ;.  if( iKey>=0x
acb0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
acc0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a  nd = &pIter[7];.
acd0: 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66      iKey &= 0x7f
ace0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a  ;.    while(1){.
acf0: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
ad00: 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ey<<7) | (*++pIt
ad10: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
ad20: 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30    if( (*pIter)<0
ad30: 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  x80 ) break;.   
ad40: 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45     if( pIter>=pE
ad50: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b  nd ){.        iK
ad60: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c  ey = (iKey<<8) |
ad70: 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20   *++pIter;.     
ad80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ad90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  }.    }.  }.  pI
ada0: 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ter++;..  pInfo-
adb0: 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26  >nKey = *(i64*)&
adc0: 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  iKey;.  pInfo->n
add0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
ade0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
adf0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
ae00: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
ae10: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
ae20: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
ae30: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
ae40: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
ae50: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
ae60: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
ae70: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
ae80: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
ae90: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
aea0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
aeb0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
aec0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
aed0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
aee0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
aef0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
af00: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
af10: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
af20: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
af30: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
af40: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
af50: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
af60: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
af70: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
af80: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
af90: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
afa0: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
afb0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
afc0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
afd0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
afe0: 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67  rIndex(.  MemPag
aff0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
b000: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
b010: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
b020: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
b030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
b040: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
b050: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
b060: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
b070: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
b080: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
b090: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b0b0: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
b0c0: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
b0d0: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
b0e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b0f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
b100: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
b110: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b120: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b130: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b140: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b150: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
b160: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
b170: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b180: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30  e->intKeyLeaf==0
b190: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
b1a0: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
b1b0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
b1c0: 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a  yload = *pIter;.
b1d0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d    if( nPayload>=
b1e0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
b1f0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
b200: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26  ;.    nPayload &
b210: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
b220: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
b230: 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c   (nPayload<<7) |
b240: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
b250: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
b260: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
b270: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
b280: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
b290: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
b2a0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
b2b0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
b2c0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
b2d0: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
b2e0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
b2f0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
b300: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
b310: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
b320: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
b330: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
b340: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
b350: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
b360: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
b370: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
b380: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
b390: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
b3a0: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
b3b0: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
b3c0: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
b3d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
b3e0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
b3f0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
b400: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
b410: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
b420: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
b430: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
b440: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
b450: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
b460: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
b470: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
b480: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
b490: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
b4a0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
b4b0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
b4c0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
b4d0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
b4e0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
b4f0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
b500: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
b510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
b520: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
b530: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
b540: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
b550: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
b560: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
b570: 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e   */.){.  pPage->
b580: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b590: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
b5a0: 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29  , iCell), pInfo)
b5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
b5c0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
b5d0: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
b5e0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
b5f0: 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a  Page.xCellSize.*
b600: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
b610: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
b620: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
b630: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
b640: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
b650: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
b660: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
b670: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
b680: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
b690: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
b6a0: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
b6b0: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
b6c0: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
b6d0: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
b6e0: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
b6f0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
b700: 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  *.** cellSizePtr
b710: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d  NoPayload()    =
b720: 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e  >   table intern
b730: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c  al nodes.** cell
b740: 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20  SizePtr()       
b750: 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69        =>   all i
b760: 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62  ndex nodes & tab
b770: 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f  le leaf nodes.*/
b780: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
b790: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
b7a0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
b7b0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
b7c0: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
b7d0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f  >childPtrSize; /
b7e0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
b7f0: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
b800: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
b840: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33  a varint */.  u3
b850: 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  2 nSize;        
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76         /* Size v
b880: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
b890: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
b8a0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
b8b0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
b8c0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
b8d0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
b8e0: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
b8f0: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
b900: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
b910: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
b920: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
b930: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
b940: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
b950: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
b960: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
b970: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
b980: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
b990: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
b9a0: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
b9b0: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
b9c0: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
b9d0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
b9e0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
b9f0: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
ba00: 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a  dif..  nSize = *
ba10: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69  pIter;.  if( nSi
ba20: 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ze>=0x80 ){.    
ba30: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
ba40: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30  ;.    nSize &= 0
ba50: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
ba60: 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a     nSize = (nSiz
ba70: 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  e<<7) | (*++pIte
ba80: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
ba90: 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e  while( *(pIter)>
baa0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
bab0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
bac0: 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67  er++;.  if( pPag
bad0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
bae0: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
baf0: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
bb00: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
bb10: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
bb20: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
bb30: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
bb40: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
bb50: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
bb60: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
bb70: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
bb80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
bb90: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
bba0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
bbb0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
bbc0: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
bbd0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
bbe0: 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e   }.  testcase( n
bbf0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
bc00: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
bc10: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
bc20: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
bc30: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50  .  if( nSize<=pP
bc40: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
bc50: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75  .    nSize += (u
bc60: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
bc70: 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  l);.    if( nSiz
bc80: 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b  e<4 ) nSize = 4;
bc90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
bca0: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
bcb0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
bcc0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
bcd0: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
bce0: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
bcf0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bd00: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
bd10: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
bd20: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
bd30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
bd40: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
bd50: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
bd60: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
bd70: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
bd80: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
bd90: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
bda0: 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28  ze += 4 + (u16)(
bdb0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
bdc0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53    }.  assert( nS
bdd0: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
bde0: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
bdf0: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
be00: 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61  u16)nSize;.}.sta
be10: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
be20: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d  PtrNoPayload(Mem
be30: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
be40: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
be50: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34  Iter = pCell + 4
be60: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
be70: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
be80: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
be90: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
bea0: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
beb0: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69   a varint */..#i
bec0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
bed0: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
bee0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
bef0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
bf00: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
bf10: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
bf20: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
bf30: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
bf40: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
bf50: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
bf60: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
bf70: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
bf80: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
bf90: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
bfa0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
bfb0: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
bfc0: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
bfd0: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
bfe0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
bff0: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
c000: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
c010: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
c020: 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  ginfo);.#else.  
c030: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
c040: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
c050: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c060: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
c070: 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49  4 );.  pEnd = pI
c080: 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65  ter + 9;.  while
c090: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
c0a0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
c0b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 62  );.  assert( deb
c0c0: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75  uginfo.nSize==(u
c0d0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
c0e0: 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
c0f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
c100: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
c110: 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  );.}...#ifdef SQ
c120: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
c130: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
c140: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
c150: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
c160: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c170: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
c180: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
c190: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
c1a0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
c1b0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
c1c0: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
c1d0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
c1e0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
c1f0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
c200: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c210: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
c220: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
c230: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
c240: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
c250: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
c260: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
c270: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
c280: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
c290: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
c2a0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
c2b0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
c2c0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
c2d0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
c2e0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
c2f0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
c300: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
c310: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
c320: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61  Cell!=0 );.  pPa
c330: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
c340: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
c350: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
c360: 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
c370: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f  load ){.    Pgno
c380: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
c390: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69  (&pCell[info.nSi
c3a0: 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d  ze-4]);.    ptrm
c3b0: 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
c3c0: 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  , ovfl, PTRMAP_O
c3d0: 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
c3e0: 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d  >pgno, pRC);.  }
c3f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
c400: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
c410: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c   page given.  Al
c420: 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65  l Cells are move
c430: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  d to the.** end 
c440: 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  of the page and 
c450: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69  all free space i
c460: 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  s collected into
c470: 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65   one.** big Free
c480: 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20  Blk that occurs 
c490: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68  in between the h
c4a0: 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a  eader and cell.*
c4b0: 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  * pointer array 
c4c0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
c4d0: 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a  tent area..**.**
c4e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c4f0: 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69  44582-60138 SQLi
c500: 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65  te may from time
c510: 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e   to time reorgan
c520: 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20  ize a.** b-tree 
c530: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
c540: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c  re are no freebl
c550: 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74  ocks or fragment
c560: 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75   bytes, all.** u
c570: 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20  nused bytes are 
c580: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
c590: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61   unallocated spa
c5a0: 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61  ce region, and a
c5b0: 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  ll.** cells are 
c5c0: 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61  packed tightly a
c5d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c5e0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
c5f0: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
c600: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c610: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c640: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
c670: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
c680: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6a0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
c6b0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
c6c0: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
c6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
c6e0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
c6f0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
c700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c710: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
c720: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
c730: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
c740: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
c750: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
c760: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c770: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
c780: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
c790: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
c7a0: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
c7b0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
c7c0: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
c7d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c7e0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
c7f0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
c800: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
c810: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
c820: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
c830: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
c840: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
c850: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
c860: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
c870: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
c880: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
c890: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
c8a0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c8c0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
c8d0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
c8e0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
c8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
c900: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
c910: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
c920: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c930: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c940: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c950: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c960: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
c970: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
c980: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
c990: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
c9a0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
c9b0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c9c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c9d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c9e0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c9f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
ca00: 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61   = 0;.  src = da
ca10: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
ca20: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
ca30: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
ca40: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
ca50: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
ca60: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
ca70: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
ca80: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
ca90: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
caa0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
cab0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
cac0: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
cad0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
cae0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
caf0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
cb00: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
cb10: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
cb20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
cb30: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
cb40: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
cb50: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
cb60: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
cb70: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
cb80: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
cb90: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
cba0: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
cbb0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
cbc0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
cbd0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
cbe0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
cbf0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
cc00: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
cc10: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
cc20: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
cc30: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
cc40: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
cc50: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
cc60: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
cc70: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
cc80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cc90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
cca0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
ccb0: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
ccc0: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
ccd0: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
cce0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  ze = pPage->xCel
ccf0: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72  lSize(pPage, &sr
cd00: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
cd10: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
cd20: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
cd30: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
cd40: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
cd50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cd60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
cd70: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
cd80: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
cd90: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
cda0: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
cdb0: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
cdc0: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
cdd0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
cde0: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
cdf0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
ce00: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
ce10: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
ce20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
ce30: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
ce40: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
ce50: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
ce60: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
ce70: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
ce80: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
ce90: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
cea0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
ceb0: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
cec0: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
ced0: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
cee0: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
cef0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
cf00: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
cf10: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
cf20: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
cf30: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
cf40: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
cf50: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
cf60: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
cf70: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
cf80: 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  2] = 0;.  data[h
cf90: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+7] = 0;.  mem
cfa0: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
cfb0: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
cfc0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
cfd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
cfe0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
cff0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d000: 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c  .  if( cbrk-iCel
d010: 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e  lFirst!=pPage->n
d020: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
d030: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d040: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
d050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d060: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
d070: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
d080: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
d090: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
d0a0: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
d0b0: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
d0c0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
d0d0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
d0e0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
d0f0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
d100: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
d110: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
d120: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
d130: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
d140: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
d150: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
d160: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
d170: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
d180: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
d190: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
d1a0: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
d1b0: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
d1c0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
d1d0: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
d1e0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
d1f0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
d200: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
d210: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
d220: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
d230: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
d240: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
d250: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
d260: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
d270: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
d280: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
d290: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
d2a0: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
d2b0: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
d2c0: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
d2d0: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
d2e0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
d2f0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
d300: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
d310: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
d320: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
d330: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
d340: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
d350: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
d360: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
d370: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
d380: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
d390: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
d3a0: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
d3b0: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69    do{.    int si
d3c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
d3d0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
d3e0: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f  ee slot */.    /
d3f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d400: 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65  -06866-39125 Fre
d410: 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61  eblocks are alwa
d420: 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20  ys connected in 
d430: 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  order of.    ** 
d440: 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65  increasing offse
d450: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  t. */.    if( pc
d460: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
d470: 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20   pc<iAddr+4 ){. 
d480: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
d490: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d4a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
d4b0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
d4c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37  IDENCE-OF: R-227
d4d0: 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69  10-53328 The thi
d4e0: 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79  rd and fourth by
d4f0: 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20  tes of each.    
d500: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72  ** freeblock for
d510: 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  m a big-endian i
d520: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
d530: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d540: 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a  freeblock.    **
d550: 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75   in bytes, inclu
d560: 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20  ding the 4-byte 
d570: 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73  header. */.    s
d580: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
d590: 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  aData[pc+2]);.  
d5a0: 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20    if( (x = size 
d5b0: 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20  - nByte)>=0 ){. 
d5c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
d5d0: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==4 );.      tes
d5e0: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
d5f0: 20 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50       if( pc < pP
d600: 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  g->cellOffset+2*
d610: 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69  pPg->nCell || si
d620: 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69  ze+pc > usableSi
d630: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ze ){.        *p
d640: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
d650: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d660: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
d670: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20    }else if( x<4 
d680: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
d690: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
d6a0: 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65  98-58022 In a we
d6b0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
d6c0: 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c   page, the total
d6d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
d6e0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66  er of bytes in f
d6f0: 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74  ragments may not
d700: 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20   exceed 60. */. 
d710: 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
d720: 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74  [hdr+7]>57 ) ret
d730: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  urn 0;..        
d740: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
d750: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
d760: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
d770: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
d780: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
d790: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
d7a0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
d7b0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
d7c0: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
d7d0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
d7e0: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
d7f0: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
d800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
d810: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
d820: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
d830: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
d840: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
d850: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
d860: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
d870: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
d880: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
d890: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
d8a0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
d8b0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
d8c0: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
d8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64  ;.    }.    iAdd
d8e0: 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d  r = pc;.    pc =
d8f0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
d900: 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28  [pc]);.  }while(
d910: 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e   pc );..  return
d920: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   0;.}../*.** All
d930: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
d940: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
d950: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
d960: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
d970: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
d980: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
d990: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
d9a0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
d9b0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
d9c0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
d9d0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
d9e0: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
d9f0: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
da00: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
da10: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
da20: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
da30: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
da40: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
da50: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
da60: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
da70: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
da80: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
da90: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
daa0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
dab0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
dac0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
dad0: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
dae0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
daf0: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
db00: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
db10: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
db20: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
db30: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
db40: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
db50: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
db60: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
db70: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
db80: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
db90: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
dba0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
dbb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
dbc0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
dbd0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
dbe0: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
dbf0: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
dc00: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
dc10: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
dc20: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
dc30: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
dc40: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
dc50: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
dc60: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
dc70: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
dc80: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
dc90: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
dcc0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
dcd0: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rea */.  int rc 
dce0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd00: 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   Integer return 
dd10: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61  code */.  int ga
dd20: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
dd30: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
dd40: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
dd50: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
dd60: 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73  ntent */.  .  as
dd70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
dd80: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
dd90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
dda0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ddb0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
ddc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ddd0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
dde0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
ddf0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
de00: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
de10: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
de20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
de30: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
de40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
de50: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
de60: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
de70: 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d  e < (int)(pPage-
de80: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
de90: 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  -8) );..  assert
dea0: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
deb0: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
dec0: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
ded0: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
dee0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
def0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
df00: 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35   assert( gap<=65
df10: 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  536 );.  /* EVID
df20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36  ENCE-OF: R-29356
df30: 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61  -02391 If the da
df40: 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35  tabase uses a 65
df50: 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69  536-byte page si
df60: 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ze.  ** and the 
df70: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69  reserved space i
df80: 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61  s zero (the usua
df90: 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65  l value for rese
dfa0: 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a  rved space).  **
dfb0: 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63   then the cell c
dfc0: 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66  ontent offset of
dfd0: 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
dfe0: 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36  ants to be 65536
dff0: 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
e000: 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20  that integer is 
e010: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
e020: 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79  stored in a 2-by
e030: 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a  te unsigned.  **
e040: 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76   integer, so a v
e050: 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65  alue of 0 is use
e060: 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  d in its place. 
e070: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
e080: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
e090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
e0a0: 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  <=(int)pPage->pB
e0b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
e0c0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67   /* Prevent by g
e0d0: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20  etAndInitPage() 
e0e0: 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  */.  if( gap>top
e0f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d   ){.    if( top=
e100: 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74  =0 && pPage->pBt
e110: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35  ->usableSize==65
e120: 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  536 ){.      top
e130: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
e140: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
e150: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e160: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
e170: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e180: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
e190: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
e1a0: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
e1b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
e1c0: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
e1d0: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
e1e0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
e1f0: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
e200: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
e210: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
e220: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
e230: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
e240: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
e250: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
e260: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
e270: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
e280: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
e290: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
e2a0: 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68  );.  if( (data[h
e2b0: 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+2] || data[hd
e2c0: 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d  r+1]) && gap+2<=
e2d0: 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  top ){.    u8 *p
e2e0: 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64  Space = pageFind
e2f0: 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74  Slot(pPage, nByt
e300: 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  e, &rc);.    if(
e310: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
e320: 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e   assert( pSpace>
e330: 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65  =data && (pSpace
e340: 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29   - data)<65536 )
e350: 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  ;.      *pIdx = 
e360: 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64  (int)(pSpace - d
e370: 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
e380: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e390: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
e3a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
e3b0: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
e3c0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63  /* The request c
e3d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66  ould not be fulf
e3e0: 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72  illed using a fr
e3f0: 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68  eelist slot.  Ch
e400: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
e410: 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69  if defragmentati
e420: 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  on is necessary.
e430: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
e440: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
e450: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
e460: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
e470: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e480: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52  ->nCell>0 || COR
e490: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72  RUPT_DB );.    r
e4a0: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
e4b0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
e4c0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
e4d0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
e4e0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
e4f0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
e500: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
e510: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
e520: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
e530: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
e540: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
e550: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
e560: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
e570: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
e580: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
e590: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
e5a0: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
e5b0: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
e5c0: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
e5d0: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
e5e0: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
e5f0: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
e600: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
e610: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
e620: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
e630: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
e640: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
e650: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
e660: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
e670: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
e680: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
e690: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
e6a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
e6b0: 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70  +nByte <= (int)p
e6c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e6d0: 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78  eSize );.  *pIdx
e6e0: 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e   = top;.  return
e6f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e700: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
e710: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
e720: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
e730: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
e740: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
e750: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
e760: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61  ck is pPage->aDa
e770: 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e  ta[iStart].** an
e780: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
e790: 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65  e block is iSize
e7a0: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64   bytes..**.** Ad
e7b0: 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b  jacent freeblock
e7c0: 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e  s are coalesced.
e7d0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
e7e0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
e7f0: 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20   freeblock list 
e800: 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62  was checked by b
e810: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a  treeInitPage(),.
e820: 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  ** that routine 
e830: 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20  will not detect 
e840: 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20  overlap between 
e850: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
e860: 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65  cks.  Nor.** doe
e870: 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c  s it detect cell
e880: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20  s or freeblocks 
e890: 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e  that encrouch in
e8a0: 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64 20  to the reserved 
e8b0: 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  bytes.** at the 
e8c0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
e8d0: 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e    So do addition
e8e0: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68  al corruption ch
e8f0: 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73  ecks inside this
e900: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  .** routine and 
e910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e920: 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f  RRUPT if any pro
e930: 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e  blems are found.
e940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
e950: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
e960: 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53 74   *pPage, u16 iSt
e970: 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b  art, u16 iSize){
e980: 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20 20  .  u16 iPtr;    
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
e9b0: 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65  ess of ptr to ne
e9c0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
e9d0: 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20    u16 iFreeBlk; 
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ea00: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  ss of the next f
ea10: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38  reeblock */.  u8
ea20: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64      /* Page head
ea50: 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31  er size.  0 or 1
ea60: 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67  00 */.  u8 nFrag
ea70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea90: 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72   Reduction in fr
eaa0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  agmentation */. 
eab0: 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d   u16 iOrigSize =
eac0: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
ead0: 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
eae0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a  al value of iSiz
eaf0: 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74  e */.  u32 iLast
eb00: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
eb10: 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20  sableSize-4; /* 
eb20: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
eb30: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
eb40: 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  t */.  u32 iEnd 
eb50: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
eb60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
eb70: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
eb80: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
eb90: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
eba0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
ebb0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
ebc0: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
ebd0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ebe0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
ebf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
ec00: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
ec10: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
ec20: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
ec30: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
ec40: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
ec50: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
ec60: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
ec70: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
ec80: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
ec90: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
eca0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
ecb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ecc0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
ecd0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
ece0: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
ecf0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
ed00: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
ed10: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69  ssert( iStart<=i
ed20: 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76  Last );..  /* Ov
ed30: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
ed40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
ed50: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
ed60: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
ed70: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
ed80: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50  bled */.  if( pP
ed90: 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  age->pBt->btsFla
eda0: 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
edb0: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65  DELETE ){.    me
edc0: 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72  mset(&data[iStar
edd0: 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20  t], 0, iSize);. 
ede0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73   }..  /* The lis
edf0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
ee00: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
ee10: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
ee20: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
ee30: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
ee40: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
ee50: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
ee60: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
ee70: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
ee80: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
ee90: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
eea0: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
eeb0: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
eec0: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
eed0: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
eee0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
eef0: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
ef00: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
ef10: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
ef20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ef30: 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69  a[iPtr]))>0 && i
ef40: 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29  FreeBlk<iStart )
ef50: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  {.      if( iFre
ef60: 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65  eBlk<iPtr+4 ) re
ef70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ef80: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
ef90: 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b  iPtr = iFreeBlk;
efa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
efb0: 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20  FreeBlk>iLast ) 
efc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
efd0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
efe0: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
eff0: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
f000: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
f010: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
f020: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
f030: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
f040: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
f050: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
f060: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
f070: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
f080: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
f090: 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a  ter to iFreeBlk.
f0a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68      **.    ** Ch
f0b0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46  eck to see if iF
f0c0: 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65  reeBlk should be
f0d0: 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20   coalesced onto 
f0e0: 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72  the end of iStar
f0f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
f100: 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45  ( iFreeBlk && iE
f110: 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29  nd+3>=iFreeBlk )
f120: 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20  {.      nFrag = 
f130: 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b  iFreeBlk - iEnd;
f140: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
f150: 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72  iFreeBlk ) retur
f160: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f170: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e  _BKPT;.      iEn
f180: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
f190: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
f1a0: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
f1b0: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
f1c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
f1d0: 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ize ) return SQL
f1e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
f1f0: 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20  ;.      iSize = 
f200: 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20  iEnd - iStart;. 
f210: 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20       iFreeBlk = 
f220: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
f230: 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d  FreeBlk]);.    }
f240: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50  .  .    /* If iP
f250: 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72  tr is another fr
f260: 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73  eeblock (that is
f270: 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74  , if iPtr is not
f280: 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
f290: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20    ** pointer in 
f2a0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29  the page header)
f2b0: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
f2c0: 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f  ee if iStart sho
f2d0: 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f  uld be.    ** co
f2e0: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
f2f0: 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20   end of iPtr..  
f300: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74    */.    if( iPt
f310: 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20  r>hdr+1 ){.     
f320: 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69   int iPtrEnd = i
f330: 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26  Ptr + get2byte(&
f340: 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20  data[iPtr+2]);. 
f350: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
f360: 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20  +3>=iStart ){.  
f370: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
f380: 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72  d>iStart ) retur
f390: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f3a0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e  _BKPT;.        n
f3b0: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
f3c0: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
f3d0: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
f3e0: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
f3f0: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
f400: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f410: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
f420: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
f430: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f440: 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  PT;.    data[hdr
f450: 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20  +7] -= nFrag;.  
f460: 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d  }.  if( iStart==
f470: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
f480: 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a  dr+5]) ){.    /*
f490: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
f4a0: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
f4b0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
f4c0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
f4d0: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
f4e0: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
f4f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
f500: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
f510: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
f520: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
f530: 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68  .    if( iPtr!=h
f540: 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51  dr+1 ) return SQ
f550: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f560: 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  T;.    put2byte(
f570: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46  &data[hdr+1], iF
f580: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
f590: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f5a0: 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c  5], iEnd);.  }el
f5b0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  se{.    /* Inser
f5c0: 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c  t the new freebl
f5d0: 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65  ock into the fre
f5e0: 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74  elist */.    put
f5f0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
f600: 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  ], iStart);.    
f610: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
f620: 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b  Start], iFreeBlk
f630: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
f640: 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c  &data[iStart+2],
f650: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70   iSize);.  }.  p
f660: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69  Page->nFree += i
f670: 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75  OrigSize;.  retu
f680: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f690: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
f6a0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
f6b0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
f6c0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
f6d0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
f6e0: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
f6f0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
f700: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
f710: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
f720: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
f730: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
f740: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
f750: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
f760: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
f770: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
f780: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
f790: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
f7a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
f7b0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
f7c0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
f7d0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f7e0: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
f7f0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
f800: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
f810: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
f820: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
f830: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
f840: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
f850: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f860: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
f870: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
f880: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
f890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
f8a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
f8b0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
f8c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f8d0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
f8e0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
f8f0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
f900: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
f910: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
f920: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
f930: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
f940: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
f950: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
f960: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
f970: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  ;.  pPage->xCell
f980: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
f990: 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  tr;.  pBt = pPag
f9a0: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
f9b0: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
f9c0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
f9d0: 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  EY) ){.    /* EV
f9e0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32  IDENCE-OF: R-072
f9f0: 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65  91-35328 A value
fa00: 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65 61   of 5 (0x05) mea
fa10: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
fa20: 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
fa30: 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  r table b-tree p
fa40: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
fa50: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
fa60: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35  A|PTF_INTKEY)==5
fa70: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
fa80: 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d  NCE-OF: R-26900-
fa90: 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66  09176 A value of
faa0: 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73   13 (0x0d) means
fab0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
fac0: 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65     ** leaf table
fad0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
fae0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
faf0: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
fb00: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d  NTKEY|PTF_LEAF)=
fb10: 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =13 );.    pPage
fb20: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
fb30: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
fb40: 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  f ){.      pPage
fb50: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31  ->intKeyLeaf = 1
fb60: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
fb70: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
fb80: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20  eParseCellPtr;. 
fb90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fba0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
fbb0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
fbc0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
fbd0: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
fbe0: 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67  load;.      pPag
fbf0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
fc00: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
fc10: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
fc20: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  }.    pPage->max
fc30: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
fc40: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
fc50: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
fc60: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
fc70: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
fc80: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
fc90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
fca0: 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30  OF: R-43316-3730
fcb0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28  8 A value of 2 (
fcc0: 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20  0x02) means the 
fcd0: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
fce0: 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78  * interior index
fcf0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
fd00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
fd10: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
fd20: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
fd30: 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32  E-OF: R-59615-42
fd40: 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31  828 A value of 1
fd50: 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74  0 (0x0a) means t
fd60: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
fd70: 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62   ** leaf index b
fd80: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
fd90: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
fda0: 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41  ZERODATA|PTF_LEA
fdb0: 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50  F)==10 );.    pP
fdc0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
fdd0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
fde0: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
fdf0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
fe00: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
fe10: 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20  llPtrIndex;.    
fe20: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
fe30: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
fe40: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
fe50: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
fe60: 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
fe70: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
fe80: 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39  F: R-47608-56469
fe90: 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65   Any other value
fea0: 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20   for the b-tree 
feb0: 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20 20  page type is.   
fec0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f   ** an error. */
fed0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fee0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fef0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
ff00: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
ff10: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
ff20: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
ff30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ff40: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
ff50: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
ff60: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
ff70: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
ff80: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
ff90: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
ffa0: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
ffb0: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
ffc0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
ffd0: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
ffe0: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
fff0: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
10000 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
10010 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
10020 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
10030 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
10040 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
10050 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
10060 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
10070 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
10080 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
10090 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
100a0 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
100b0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
100c0 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
100d0 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
100e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
100f0 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
10100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
10120 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10130 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10140 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
10150 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
10160 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10180 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
10190 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
101a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
101b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
101c0 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
101d0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
101e0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
101f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
10200 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
10210 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
10220 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
10230 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
10240 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
10250 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
10260 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
10270 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
10280 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
10290 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
102a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
102b0 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
102c0 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
102d0 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
102e0 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
102f0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
10300 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
10310 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
10320 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
10330 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
10340 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
10350 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
10360 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
10370 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
10380 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
10390 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
103a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
103b0 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
103c0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
103d0 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
103e0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
103f0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
10400 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
10410 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
10420 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
10430 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
10440 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
10450 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
10460 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
10470 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
10480 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
10490 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
104a0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
104b0 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
104c0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
104d0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
104e0 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  ta;.    /* EVIDE
104f0 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
10500 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
10510 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
10520 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
10530 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65     ** the b-tree
10540 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
10550 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
10560 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
10570 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
10580 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
10590 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
105a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
105b0 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
105c0 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
105d0 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
105e0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
105f0 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
10600 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
10610 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
10620 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
10630 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
10640 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
10650 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
10660 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63  r + 8 + pPage->c
10670 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
10680 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
10690 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
106a0 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
106b0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
106c0 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
106d0 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f     pPage->aDataO
106e0 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
106f0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
10700 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
10710 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38  E-OF: R-58015-48
10720 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65  175 The two-byte
10730 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
10740 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a  et 5 designates.
10750 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74      ** the start
10760 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
10770 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72  tent area. A zer
10780 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  o value for this
10790 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20   integer is.    
107a0 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
107b0 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20  s 65536. */.    
107c0 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
107d0 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
107e0 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5]);.    /* EVID
107f0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32  ENCE-OF: R-37002
10800 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62  -32774 The two-b
10810 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
10820 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68  ffset 3 gives th
10830 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
10840 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
10850 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  page. */.    pPa
10860 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
10870 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
10880 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
10890 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
108a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
108b0 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
108c0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
108d0 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
108e0 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
108f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10900 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
10920 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
10930 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
10940 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
10950 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d  NCE-OF: R-24089-
10960 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20  57979 If a page 
10970 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
10980 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  s (which is only
10990 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  .    ** possible
109a0 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65   for a root page
109b0 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74   of a table that
109c0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
109d0 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s) then the.    
109e0 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  ** offset to the
109f0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
10a00 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68  ea will equal th
10a10 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75  e page size minu
10a20 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74  s the.    ** byt
10a30 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
10a40 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  pace. */.    ass
10a50 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
10a60 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62  l>0 || top==usab
10a70 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  leSize || CORRUP
10a80 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  T_DB );..    /* 
10a90 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
10aa0 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
10ab0 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64  cause us to read
10ac0 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
10ad0 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
10ae0 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
10af0 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
10b00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
10b10 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
10b20 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
10b30 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
10b40 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
10b50 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
10b60 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
10b70 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
10b80 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
10b90 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
10ba0 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  t does..    */. 
10bb0 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
10bc0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
10bd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
10be0 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
10bf0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
10c00 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c   if( pBt->db->fl
10c10 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c  ags & SQLITE_Cel
10c20 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20  lSizeCk ){.     
10c30 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10c40 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
10c50 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
10c60 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
10c70 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
10c80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
10c90 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
10ca0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
10cb0 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
10cc0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10cd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
10ce0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
10cf0 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
10d00 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
10d10 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
10d20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
10d30 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
10d40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
10d50 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
10d60 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
10d70 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
10d80 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
10d90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10da0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
10db0 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
10dc0 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
10dd0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
10de0 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
10df0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10e00 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
10e10 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
10e20 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
10e30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
10e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10e50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
10e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10e70 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
10e80 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
10e90 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20  +;.    }  ..    
10ea0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
10eb0 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
10ec0 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  on the page.    
10ed0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
10ee0 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
10ef0 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
10f00 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
10f10 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
10f20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
10f30 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
10f40 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
10f50 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
10f60 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65  e no.    ** free
10f70 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70  blocks. */.    p
10f80 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
10f90 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
10fa0 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
10fb0 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
10fc0 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
10fd0 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
10fe0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69  space */.    whi
10ff0 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
11000 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
11010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
11020 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
11030 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
11040 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
11050 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
11060 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
11070 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
11080 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
11090 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
110a0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
110b0 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
110c0 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
110d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
110e0 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65    ** Or, the fre
110f0 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68  eblock is off th
11100 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
11110 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
11120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11130 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11140 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
11150 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
11160 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
11170 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
11180 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
11190 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e        if( (next>
111a0 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
111b0 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65  ze+3) || pc+size
111c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
111d0 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
111e0 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
111f0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
11200 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62  . And the last b
11210 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  yte of.        *
11220 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  * the free-block
11230 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65   must lie on the
11240 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
11250 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
11260 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11270 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
11280 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
11290 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
112a0 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
112b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
112c0 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
112d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
112e0 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
112f0 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20  to the start.   
11300 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
11310 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
11320 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
11330 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
11340 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c  n.    ** the cel
11350 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
11360 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
11370 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
11380 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f  le-size.    ** o
11390 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
113a0 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
113b0 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
113c0 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20  s check also.   
113d0 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
113e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
113f0 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
11400 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
11410 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65  ntent.    ** are
11420 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
11430 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
11440 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
11450 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
11460 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
11470 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
11480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11490 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
114a0 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46   }.    pPage->nF
114b0 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
114c0 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
114d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
114e0 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
114f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11500 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
11510 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
11520 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
11530 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
11540 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
11550 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
11560 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
11570 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
11580 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
11590 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
115a0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
115b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
115c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
115d0 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
115e0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
115f0 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
11600 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11610 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
11620 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
11630 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
11640 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11650 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11660 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
11670 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
11680 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11690 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
116a0 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
116b0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
116c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
116d0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
116e0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
116f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11700 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11710 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
11720 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
11730 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
11740 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
11750 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
11760 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
11770 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
11780 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
11790 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
117a0 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
117b0 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
117c0 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
117d0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
117e0 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
117f0 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
11800 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
11810 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
11820 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
11830 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
11840 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
11850 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
11860 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
11870 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
11880 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
11890 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
118a0 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
118b0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
118c0 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
118d0 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
118e0 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
118f0 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
11900 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  PtrSize];.  pPag
11910 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
11920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11930 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
11940 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
11950 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
11960 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
11970 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
11980 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
11990 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
119a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
119b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
119c0 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
119d0 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
119e0 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
119f0 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
11a00 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
11a10 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
11a20 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
11a30 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
11a40 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
11a50 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
11a60 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
11a70 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
11a80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11a90 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
11aa0 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d  if( pgno!=pPage-
11ab0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
11ac0 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
11ad0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
11ae0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50  pDbPage);.    pP
11af0 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
11b00 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67  DbPage;.    pPag
11b10 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
11b20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
11b30 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  pgno;.    pPage-
11b40 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e  >hdrOffset = pgn
11b50 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
11b60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
11b70 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  age->aData==sqli
11b80 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
11b90 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
11ba0 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
11bb0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
11bc0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
11bd0 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
11be0 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
11bf0 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
11c00 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
11c10 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
11c20 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
11c30 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
11c40 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
11c50 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
11c60 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
11c70 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
11c80 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
11c90 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
11ca0 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
11cb0 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
11cc0 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
11cd0 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
11ce0 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
11cf0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
11d00 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
11d10 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
11d20 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
11d30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
11d40 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
11d50 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
11d60 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
11d70 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
11d80 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
11d90 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
11da0 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
11db0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
11dc0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
11dd0 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
11de0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
11df0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
11e00 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
11e10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11e20 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
11e30 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
11e40 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
11e50 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
11e60 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
11e70 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
11e80 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
11e90 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
11ea0 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
11eb0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
11ec0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
11ed0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
11ee0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
11ef0 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
11f00 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
11f10 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
11f20 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
11f30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11f40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11f50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
11f60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11f70 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
11f80 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
11f90 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
11fa0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
11fb0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
11fc0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
11fd0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11fe0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11ff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
12010 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
12020 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
12030 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
12040 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
12050 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
12060 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
12070 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
12080 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
12090 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
120a0 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
120b0 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
120c0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
120d0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
120e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
120f0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
12100 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
12110 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12120 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
12130 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
12140 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
12150 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
12160 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
12170 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
12180 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
12190 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
121a0 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
121b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
121c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
121d0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
121e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
121f0 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
12200 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
12210 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
12220 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
12230 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
12240 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
12250 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
12260 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
12270 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
12280 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
12290 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
122a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
122b0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
122c0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
122d0 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
122e0 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
122f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
12300 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
12310 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
12320 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
12330 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
12340 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
12350 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
12360 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
12370 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
12380 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
12390 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
123a0 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
123b0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
123c0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
123d0 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
123e0 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
123f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
12400 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
12410 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
12420 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
12430 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
12440 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
12450 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
12460 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
12470 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
12480 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12490 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
124a0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
124b0 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
124c0 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
124d0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
124e0 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
124f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
12500 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
12510 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12540 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
12550 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
12560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12570 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
12580 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
12590 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
125a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
125b0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
125c0 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
125d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
12600 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
12610 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
12620 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
12630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12640 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
12650 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
12660 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
12670 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
12680 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12690 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
126a0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
126b0 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
126c0 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61  age==&pCur->apPa
126d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
126e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
126f0 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
12700 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
12710 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
12720 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
12730 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
12740 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
12750 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
12760 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12770 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12780 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
12790 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
127a0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
127b0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
127c0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
127d0 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
127e0 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , bReadOnly);.  
127f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f  if( rc ){.    go
12800 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
12810 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a  e_error;.  }.  *
12820 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  ppPage = (MemPag
12830 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
12840 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
12850 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ;.  if( (*ppPage
12860 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
12870 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f      btreePageFro
12880 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
12890 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20   pgno, pBt);.   
128a0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
128b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
128c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
128d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
128e0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
128f0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  );.      goto ge
12900 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
12910 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
12920 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
12930 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
12940 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
12950 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  age)->aData==sql
12960 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
12970 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  (pDbPage) );..  
12980 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20  /* If obtaining 
12990 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72  a child page for
129a0 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75   a cursor, we mu
129b0 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74  st verify that t
129c0 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20  he page is.  ** 
129d0 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
129e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a  the root page. *
129f0 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20  /.  if( pCur && 
12a00 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c  ((*ppPage)->nCel
12a10 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  l<1 || (*ppPage)
12a20 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
12a30 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20  curIntKey) ){.  
12a40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
12a50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12a60 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
12a70 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  age);.    goto g
12a80 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12a90 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ror;.  }.  retur
12aa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65  n SQLITE_OK;..ge
12ab0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
12ac0 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  or:.  if( pCur )
12ad0 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
12ae0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
12af0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12b00 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
12b10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
12b20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12b30 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
12b40 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
12b50 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
12b60 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
12b70 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
12b80 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
12b90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
12ba0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
12bb0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12bc0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
12bd0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
12be0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
12bf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12c00 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
12c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12c20 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
12c30 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
12c40 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
12c50 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
12c60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12c70 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
12c80 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
12c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12ca0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12cb0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12cc0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
12cd0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
12ce0 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
12cf0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
12d00 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
12d10 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12d20 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
12d30 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
12d40 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
12d50 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
12d60 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
12d70 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
12d80 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
12d90 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
12da0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
12db0 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
12dc0 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
12dd0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
12de0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
12df0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
12e00 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
12e10 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
12e20 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
12e30 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
12e40 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
12e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12e60 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
12e70 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12e80 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
12e90 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
12ea0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12eb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
12ec0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
12ed0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
12ee0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
12ef0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
12f00 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
12f10 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
12f20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
12f30 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
12f40 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
12f50 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
12f60 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
12f70 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
12f80 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
12f90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12fa0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
12fb0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
12fc0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
12fd0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
12fe0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
12ff0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
13000 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
13010 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13020 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
13030 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
13040 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
13050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
13060 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
13070 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
13080 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
13090 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
130a0 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
130b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
130c0 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
130d0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
130e0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
130f0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
13100 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
13110 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
13120 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
13130 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
13140 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13150 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
13160 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
13170 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
13180 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
13190 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
131a0 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
131b0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
131c0 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
131d0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
131e0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
131f0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
13200 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
13210 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
13220 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
13230 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
13240 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13250 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
13260 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
13270 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
13280 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13290 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
132a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
132b0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
132c0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
132d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
132e0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
132f0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
13300 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
13310 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
13320 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
13330 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
13340 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
13350 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
13360 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
13370 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
13380 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
13390 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
133a0 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
133b0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
133c0 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
133d0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
133e0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
133f0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
13400 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
13410 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
13420 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
13430 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
13440 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
13450 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
13460 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
13470 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
13480 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
13490 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
134a0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
134b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
134c0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
134d0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
134e0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
134f0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
13500 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
13510 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
13520 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
13530 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
13540 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
13550 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13560 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
13570 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
13580 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13590 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
135a0 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
135b0 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
135c0 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
135d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
135e0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
135f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
13600 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
13610 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
13620 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
13630 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
13640 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
13650 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
13660 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
13670 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
13680 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
13690 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
136a0 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
136b0 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
136c0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
136d0 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
136e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
136f0 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
13700 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
13710 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
13720 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
13730 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
13740 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
13750 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
13760 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
13770 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
13780 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
13790 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
137a0 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
137b0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
137c0 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
137d0 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
137e0 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
137f0 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
13800 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
13810 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
13820 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
13830 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
13840 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13850 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
13860 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
13870 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
13880 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
13890 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
138a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
138b0 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
138c0 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
138d0 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
138e0 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
138f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13900 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
13910 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
13920 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
13930 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
13940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
13950 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
13960 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
13970 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
13980 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
13990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
139a0 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
139b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
139c0 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
139d0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
139e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
139f0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
13a00 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
13a10 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
13a20 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
13a30 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
13a40 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
13a50 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
13a60 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
13a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13a80 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
13a90 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
13aa0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
13ab0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
13ac0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
13ad0 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
13ae0 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
13af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
13b00 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
13b10 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
13b20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
13b50 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
13b60 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
13b70 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
13b80 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
13b90 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
13ba0 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
13bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13bc0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13bd0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
13be0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
13bf0 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c10 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
13c20 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
13c30 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
13c40 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
13c50 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
13c60 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
13c70 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
13c80 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
13c90 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
13ca0 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
13cb0 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
13cc0 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
13cd0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
13ce0 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
13cf0 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
13d00 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
13d10 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13d20 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
13d30 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
13d40 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
13d50 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
13d60 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
13d70 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
13d80 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
13d90 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
13da0 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
13db0 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
13dc0 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
13dd0 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13df0 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
13e00 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
13e10 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13e30 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
13e40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
13e50 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
13e60 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
13e70 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
13e80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13e90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13ea0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
13eb0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
13ec0 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
13ed0 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
13ee0 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
13ef0 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
13f00 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
13f10 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
13f20 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
13f30 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
13f40 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
13f50 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
13f60 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
13f70 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
13f80 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
13f90 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
13fa0 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
13fb0 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
13fc0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
13fd0 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
13fe0 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
13ff0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
14000 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
14010 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
14020 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
14030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
14040 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
14050 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
14060 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
14070 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
14080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
14090 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
140a0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
140b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
140c0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
140d0 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
140e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
140f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14100 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
14110 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
14120 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
14130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14140 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
14150 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
14160 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
14170 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
14180 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
14190 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
141a0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
141b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
141c0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
141d0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
141e0 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
141f0 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
14200 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
14210 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
14220 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
14230 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
14240 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
14250 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
14260 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
14270 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
14280 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
14290 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
142a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
142b0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
142c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  .      int nFile
142d0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
142e0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
142f0 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  )+1;.      int n
14300 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
14310 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
14320 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
14330 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
14340 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58  qlite3Malloc(MAX
14350 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e  (nFullPathname,n
14360 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
14370 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
14380 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
14390 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20  texShared; )..  
143a0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
143b0 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
143c0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
143d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
143e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
143f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14400 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
14410 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
14420 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
14430 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
14440 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
14450 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
14460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14480 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
14490 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
144d0 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
144e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
144f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
14500 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14510 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
14520 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14530 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
14540 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14550 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
14560 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
14570 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
14580 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
14590 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
145a0 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
145b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
145c0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
145d0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
145e0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
145f0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14600 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
14610 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
14620 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14630 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
14640 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
14650 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
14660 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14670 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
14680 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
14690 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
146a0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
146b0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
146c0 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
146d0 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
146e0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
146f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
14700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14710 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
14720 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
14730 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
14740 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
14750 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
14760 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
14770 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
14780 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
14790 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
147a0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
147b0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
147c0 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
147d0 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
147f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14800 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14820 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14830 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
14840 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14850 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14860 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14880 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
14890 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
148a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
148b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
148c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
148d0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
148e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
148f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
14900 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14910 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14920 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14930 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
14940 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
14950 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14960 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
14970 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14980 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14990 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
149a0 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
149b0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
149c0 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
149d0 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
149e0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
149f0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
14a00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
14a10 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
14a20 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
14a30 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
14a40 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
14a50 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
14a60 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
14a70 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
14a80 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
14a90 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
14aa0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
14ab0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
14ac0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
14ad0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
14ae0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
14af0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
14b00 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
14b10 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
14b20 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
14b30 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
14b40 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
14b50 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
14b60 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
14b70 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
14b80 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
14b90 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
14ba0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
14bb0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
14bc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14bd0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
14be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
14bf0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
14c00 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14c10 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
14c20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14c30 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
14c40 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
14c50 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
14c60 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
14c70 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
14c80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14c90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
14ca0 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
14cb0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
14cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14cd0 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
14ce0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
14cf0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
14d20 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
14d30 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
14d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14d50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14d60 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
14d70 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
14d80 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
14d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14da0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
14db0 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
14dc0 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
14dd0 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
14de0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
14df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14e00 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
14e10 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
14e20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
14e30 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
14e40 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
14e50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
14e60 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
14e70 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
14e80 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
14e90 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
14ea0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
14eb0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
14ec0 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
14ed0 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
14ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
14ef0 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
14f00 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
14f10 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
14f20 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
14f30 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
14f40 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
14f50 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
14f60 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
14f70 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  f.    /* EVIDENC
14f80 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
14f90 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
14fa0 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
14fb0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
14fc0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
14fd0 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
14fe0 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
14ff0 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
15000 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
15010 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
15020 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15030 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61  . */.    pBt->pa
15040 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
15050 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
15060 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
15070 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
15080 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
15090 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
150a0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
150b0 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
150c0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
150d0 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
150e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
150f0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
15100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15110 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
15120 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
15130 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
15140 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
15150 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
15160 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
15170 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
15180 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
15190 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
151a0 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
151b0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
151c0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
151d0 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
151e0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
151f0 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
15200 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
15210 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
15220 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
15230 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
15240 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
15250 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
15260 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
15270 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
15280 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
15290 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
152a0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
152b0 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
152c0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
152d0 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
152e0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
152f0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
15300 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
15310 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
15320 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
15330 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
15340 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
15350 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
15360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15370 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
15380 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
15390 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
153a0 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
153b0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  .      ** determ
153c0 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
153d0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
153e0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
153f0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
15400 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
15410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
15420 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eader. */.      
15430 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
15440 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
15450 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15460 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
15470 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
15480 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
15490 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
154a0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
154b0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
154c0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
154d0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
154e0 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
154f0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
15500 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
15510 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
15520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15530 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
15540 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
15550 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
15560 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
15570 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
15580 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
15590 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
155a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
155b0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
155c0 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
155d0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
155e0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
155f0 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
15600 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
15610 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
15620 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
15630 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15640 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
15650 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
15660 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
15670 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
15680 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
15690 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
156a0 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
156b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
156c0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
156d0 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
156e0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
156f0 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d  hared; ).      M
15700 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
15710 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
15720 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15730 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15740 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
15750 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
15760 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
15770 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
15780 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
15790 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
157a0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
157b0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
157c0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
157d0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
157e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
157f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
15800 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
15810 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
15820 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
15830 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15840 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15850 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
15860 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
15870 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
15880 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15890 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
158a0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
158b0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
158c0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
158d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
158e0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
158f0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
15900 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
15910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15920 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15930 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
15940 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
15950 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
15960 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
15970 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
15980 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
15990 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
159a0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
159b0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
159c0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
159d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
159e0 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
159f0 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
15a00 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
15a10 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
15a20 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
15a30 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
15a40 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
15a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
15a60 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
15a70 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
15a80 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
15a90 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
15aa0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
15ab0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
15ac0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
15ad0 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
15ae0 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42   if( (uptr)p->pB
15af0 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42  t<(uptr)pSib->pB
15b00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
15b10 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
15b20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
15b30 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
15b40 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
15b50 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
15b60 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
15b70 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
15b80 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e  & (uptr)pSib->pN
15b90 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  ext->pBt<(uptr)p
15ba0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
15bb0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
15bc0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
15bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
15be0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
15bf0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
15c00 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
15c10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15c20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
15c30 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15c40 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
15c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15c60 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
15c70 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
15c80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15c90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
15ca0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
15cb0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
15cc0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
15cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15ce0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
15cf0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
15d00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
15d10 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
15d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15d30 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
15d40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15d50 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
15d60 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15d70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
15d80 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
15d90 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
15da0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
15db0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
15dc0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
15dd0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
15de0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
15df0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
15e00 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
15e10 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
15e20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
15e30 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
15e40 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15e50 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
15e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
15e70 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15e80 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
15e90 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
15ea0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
15eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15ec0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
15ed0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15ee0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
15ef0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
15f00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15f10 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
15f20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
15f30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
15f40 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65  qlite3BtreeConne
15f50 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74  ctionCount(*ppBt
15f60 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75  ree)>0 );.  retu
15f70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15f80 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
15f90 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
15fa0 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
15fb0 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
15fc0 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
15fd0 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
15fe0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
15ff0 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
16000 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
16010 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
16020 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
16030 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
16040 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
16050 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
16060 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
16070 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
16080 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
16090 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
160a0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
160b0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
160c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
160d0 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
160e0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
160f0 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
16100 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16110 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
16120 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16130 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
16140 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
16150 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
16160 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
16170 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
16180 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
16190 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
161a0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
161b0 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
161c0 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
161d0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
161e0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
161f0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
16200 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
16210 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
16220 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
16230 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
16240 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
16250 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
16260 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
16270 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
16280 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
16290 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
162a0 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
162b0 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
162c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
162d0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
162e0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
162f0 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
16300 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
16310 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16320 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
16330 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
16340 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
16350 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
16360 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
16370 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
16380 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
16390 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
163a0 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
163b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
163c0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
163d0 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
163e0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
163f0 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
16400 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
16410 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68  (pBt) bytes with
16420 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78   a 4-byte prefix
16430 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c   for a left-chil
16440 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  d.** pointer..*/
16450 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
16460 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
16470 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16480 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
16490 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
164a0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
164b0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
164c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
164d0 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
164e0 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
164f0 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
16500 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
16510 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
16520 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
16530 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
16540 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
16550 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
16560 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
16570 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
16580 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
16590 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
165a0 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
165b0 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
165c0 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
165d0 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
165e0 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
165f0 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
16600 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
16610 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
16620 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
16630 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
16640 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
16650 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
16660 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
16670 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
16680 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
16690 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
166a0 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
166b0 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
166c0 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
166d0 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
166e0 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
166f0 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
16700 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
16710 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
16720 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
16730 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
16740 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
16750 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
16760 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
16770 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ere..    **.    
16780 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64  ** Also:  Provid
16790 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  e four bytes of 
167a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
167b0 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
167c0 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   ** beginning of
167d0 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e   pTmpSpace as an
167e0 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20   area available 
167f0 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20  to prepend the. 
16800 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64     ** left-child
16810 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16820 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63  beginning of a c
16830 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
16840 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
16850 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ce ){.      mems
16860 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  et(pBt->pTmpSpac
16870 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20  e, 0, 8);.      
16880 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b  pBt->pTmpSpace +
16890 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 4;.    }.  }.}
168a0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
168b0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
168c0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
168d0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
168e0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
168f0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42   *pBt){.  if( pB
16900 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16910 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16920 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c  ce -= 4;.    sql
16930 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74  ite3PageFree(pBt
16940 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
16950 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16960 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
16970 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
16980 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
16990 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
169a0 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
169b0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
169c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
169d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
169e0 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
169f0 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
16a00 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
16a10 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
16a20 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ndle.  */.  asse
16a30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16a40 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16a50 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16a60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16a70 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
16a80 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
16a90 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
16aa0 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
16ab0 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
16ac0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
16ad0 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
16ae0 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
16af0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
16b00 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
16b10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
16b20 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
16b30 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
16b40 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
16b50 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
16b60 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
16b70 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
16b80 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
16b90 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
16ba0 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
16bb0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16bc0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
16bd0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
16be0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16bf0 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
16c00 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
16c10 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
16c20 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
16c30 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
16c40 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
16c50 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
16c60 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
16c70 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
16c80 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
16c90 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
16ca0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16cb0 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
16cc0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
16cd0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
16ce0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
16cf0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
16d00 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
16d10 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
16d20 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
16d30 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
16d40 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
16d50 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
16d60 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
16d70 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
16d80 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
16d90 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
16da0 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
16db0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16dc0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
16dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16de0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
16df0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
16e00 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
16e10 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
16e20 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
16e30 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
16e40 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
16e50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
16e60 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
16e70 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
16e80 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
16e90 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
16ea0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16eb0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
16ec0 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
16ed0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
16ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16ef0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
16f00 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
16f10 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
16f20 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
16f30 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
16f40 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
16f50 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
16f60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16f80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16f90 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74  Change the "soft
16fa0 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
16fb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
16fc0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
16fd0 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64  Unused and unmod
16fe0 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c  ified pages will
16ff0 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65   be recycled whe
17000 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
17010 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
17020 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68  cache exceeds th
17030 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20  is soft limit.  
17040 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  But the size of 
17050 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20  the.** cache is 
17060 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20  allowed to grow 
17070 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
17080 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e   limit if it con
17090 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70  tains.** dirty p
170a0 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74  ages or pages st
170b0 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73  ill in active us
170c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
170d0 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
170e0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
170f0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
17100 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17110 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
17120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17130 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
17140 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17150 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
17160 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
17170 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
17180 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
17190 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
171a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
171b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
171c0 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c  Change the "spil
171d0 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  l" limit on the 
171e0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
171f0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
17200 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
17210 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20  f pages exceeds 
17220 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e  this limit durin
17230 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
17240 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61  ction,.** the pa
17250 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ger might attemp
17260 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67  t to "spill" pag
17270 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
17280 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72  l early in.** or
17290 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
172a0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
172b0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
172c0 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  is the current s
172d0 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a  pill size.  If z
172e0 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a  ero is passed.**
172f0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   as an argument,
17300 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
17310 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c  made to the spil
17320 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20  l size setting, 
17330 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61  so.** using mxPa
17340 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79  ge of 0 is a way
17350 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
17360 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
17370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17380 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
17390 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
173a0 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
173b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
173c0 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  t;.  int res;.  
173d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
173e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
173f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
17400 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17410 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  p);.  res = sqli
17420 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
17430 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
17440 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
17450 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17460 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
17470 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
17480 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
17490 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
174a0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
174b0 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
174c0 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
174d0 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
174e0 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
174f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
17500 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
17510 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
17520 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
17530 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17540 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17550 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17560 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17570 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17580 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
17590 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
175a0 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
175b0 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
175c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
175d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
175e0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
175f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17600 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
17610 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
17620 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
17630 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
17640 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
17650 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
17660 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
17670 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
17680 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
17690 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
176a0 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
176b0 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
176c0 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
176d0 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
176e0 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
176f0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
17700 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
17710 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
17720 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
17730 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
17740 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
17750 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17760 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
17770 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
17780 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17790 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
177a0 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
177b0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
177c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
177d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
177e0 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
177f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
17800 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
17810 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
17820 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
17830 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
17840 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
17850 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
17860 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
17870 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
17880 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
17890 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
178a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
178b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
178c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
178d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
178e0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
178f0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
17900 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
17910 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
17920 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17940 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17950 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
17960 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
17970 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
17980 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
17990 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
179a0 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
179b0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
179c0 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
179d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
179e0 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
179f0 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
17a00 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
17a10 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
17a20 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
17a30 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
17a40 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
17a50 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
17a60 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
17a70 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
17a80 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
17a90 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
17aa0 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
17ab0 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
17ac0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
17ad0 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
17ae0 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
17af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17b00 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
17b10 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
17b20 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
17b30 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
17b40 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
17b50 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
17b60 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
17b70 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
17b80 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
17b90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
17ba0 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
17bb0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
17bc0 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
17bd0 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
17be0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
17bf0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
17c00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
17c10 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
17c20 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
17c30 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
17c40 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
17c50 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
17c60 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
17c70 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
17c80 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
17c90 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
17ca0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
17cb0 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
17cc0 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
17cd0 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
17ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
17cf0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17d00 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
17d10 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
17d20 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
17d30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17d40 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
17d50 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
17d60 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
17d70 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17d80 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
17d90 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
17da0 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
17db0 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
17dc0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
17dd0 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
17de0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17df0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
17e00 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
17e10 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
17e20 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
17e30 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
17e40 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
17e50 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
17e60 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
17e70 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
17e80 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
17e90 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
17ea0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
17eb0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
17ec0 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
17ed0 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
17ee0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
17ef0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
17f00 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
17f10 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
17f20 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
17f30 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
17f40 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
17f50 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
17f60 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
17f70 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
17f80 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
17f90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
17fa0 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
17fb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
17fc0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
17fd0 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
17fe0 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
17ff0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
18000 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
18010 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18020 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
18040 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
18050 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
18060 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
18070 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
18080 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
18090 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
180a0 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
180b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
180c0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
180d0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
180e0 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
180f0 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
18100 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
18110 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
18120 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
18130 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
18140 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
18150 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
18160 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
18170 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
18180 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
18190 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
181a0 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
181b0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
181c0 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
181d0 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
181e0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
181f0 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
18200 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
18210 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
18220 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
18230 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
18240 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
18250 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
18260 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
18270 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
18280 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
18290 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
182a0 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
182b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
182c0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
182d0 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
182e0 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
182f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18300 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
18310 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
18320 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
18330 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
18340 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
18350 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18360 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18370 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
18380 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
18390 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
183a0 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
183b0 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
183c0 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
183d0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
183e0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
183f0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
18400 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
18410 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
18420 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
18430 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
18440 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
18450 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
18460 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
18470 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
18480 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
18490 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
184a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
184b0 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
184c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
184d0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
184e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
184f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18500 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
18510 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
18520 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
18530 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
18540 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
18550 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
18560 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
18570 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18580 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18590 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
185a0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
185b0 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
185c0 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
185d0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
185e0 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
185f0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
18600 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
18610 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
18620 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
18630 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
18640 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
18650 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
18660 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
18670 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
18680 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
18690 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
186a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
186b0 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
186c0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
186d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
186e0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
186f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18700 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
18710 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
18720 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
18730 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
18740 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
18750 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
18760 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
18770 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
18780 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
18790 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
187a0 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
187b0 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
187c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
187d0 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
187e0 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
187f0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
18800 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
18810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
18820 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18830 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
18840 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
18850 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
18860 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18870 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
18880 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
18890 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
188a0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
188b0 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
188c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
188d0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
188e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
188f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18900 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn b;.}../*.** C
18910 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
18920 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
18930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18940 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
18950 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
18960 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
18970 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
18980 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
18990 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
189a0 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
189b0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
189c0 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
189d0 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
189e0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
189f0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
18a00 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
18a10 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
18a20 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
18a30 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
18a40 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
18a50 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
18a60 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18a70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18a80 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
18a90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18aa0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
18ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18ac0 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
18ad0 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
18ae0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18af0 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
18b00 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
18b10 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
18b20 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
18b30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
18b40 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18b50 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
18b60 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
18b70 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
18b80 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
18b90 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
18ba0 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
18bb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18bd0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
18be0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
18bf0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
18c00 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
18c10 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
18c20 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
18c30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
18c40 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
18c50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18c60 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
18c70 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
18c80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
18c90 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
18ca0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
18cb0 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
18cc0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
18cd0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
18ce0 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
18cf0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
18d00 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18d10 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
18d20 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
18d30 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
18d40 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
18d50 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
18d60 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
18d70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18d80 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
18d90 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
18da0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
18db0 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
18dc0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
18dd0 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
18de0 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
18df0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
18e00 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
18e10 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
18e20 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
18e30 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
18e40 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
18e50 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
18e60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
18e70 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
18e80 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
18e90 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
18ea0 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
18eb0 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
18ec0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
18ed0 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
18ee0 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
18ef0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
18f00 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
18f10 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
18f20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
18f30 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
18f40 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
18f50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
18f60 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
18f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18f80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
18f90 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
18fa0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
18fb0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
18fc0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
18fd0 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
18fe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19000 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
19010 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
19020 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19030 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
19040 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
19050 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
19060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19070 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19080 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
19090 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
190a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
190b0 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
190c0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
190d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
190e0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
190f0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
19100 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
19110 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19120 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19130 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
19140 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
19150 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
19160 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
19170 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
19180 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
19190 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
191a0 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
191b0 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
191c0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
191d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
191e0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
191f0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
19200 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
19210 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
19220 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
19230 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
19240 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
19250 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
19260 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
19270 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
19280 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
19290 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
192a0 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
192b0 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
192c0 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
192d0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
192e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
192f0 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
19300 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
19310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
19320 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
19330 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
19340 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
19350 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
19360 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
19370 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
19380 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
19390 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
193a0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
193b0 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
193c0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
193d0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
193e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
193f0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
19400 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
19410 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
19420 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
19430 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
19440 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
19450 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
19460 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19470 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
19480 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
19490 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
194a0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
194b0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
194c0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
194d0 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
194e0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
194f0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
19500 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
19510 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
19520 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
19530 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
19540 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
19550 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
19560 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
19570 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
19580 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
19590 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
195a0 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
195b0 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
195c0 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
195d0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
195e0 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
195f0 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
19600 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
19610 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
19620 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
19630 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
19640 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
19650 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
19660 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
19670 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
19680 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
19690 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
196a0 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
196b0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
196c0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
196d0 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
196e0 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
196f0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
19700 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
19710 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19720 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
19730 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
19740 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
19750 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19760 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
19770 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
19790 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
197a0 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c  SYNCHRONOUS!=SQL
197b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
197c0 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 20 20 20 20  SYNCHRONOUS.    
197d0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
197e0 0a 20 20 20 20 20 20 20 20 44 62 20 2a 70 44 62  .        Db *pDb
197f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
19800 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26  b=pBt->db)!=0 &&
19810 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d   (pDb=db->aDb)!=
19820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
19830 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
19840 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
19850 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
19860 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ; }.          if
19870 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d  ( pDb->bSyncSet=
19880 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
19890 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
198a0 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  el==SQLITE_DEFAU
198b0 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  LT_SYNCHRONOUS+1
198c0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
198d0 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
198e0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51  afety_level = SQ
198f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
19900 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a  _SYNCHRONOUS+1;.
19910 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
19920 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
19930 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20  (pBt->pPager,.  
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62               pDb
19950 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c  ->safety_level |
19960 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41   (db->flags & PA
19970 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29  GER_FLAGS_MASK))
19980 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19990 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
199a0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65         if( isOpe
199b0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
199c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
199d0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
199e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
199f0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
19a00 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
19a10 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
19a20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
19a30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19a40 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54   R-15465-20813 T
19a50 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d  he maximum and m
19a60 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  inimum embedded 
19a70 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66  payload.    ** f
19a80 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  ractions and the
19a90 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72   leaf payload fr
19aa0 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75  action values mu
19ab0 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e  st be 64, 32, an
19ac0 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  d 32..    **.   
19ad0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
19ae0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
19af0 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
19b00 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
19b10 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
19b20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
19b30 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
19b40 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
19b50 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
19b60 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
19b70 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
19b80 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
19b90 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
19ba0 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
19bb0 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
19bc0 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
19bd0 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
19be0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
19bf0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
19c00 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
19c10 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
19c20 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
19c30 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
19c40 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
19c50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19c60 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a  . */.    pageSiz
19c70 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c  e = (page1[16]<<
19c80 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c  8) | (page1[17]<
19c90 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  <16);.    /* EVI
19ca0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30  DENCE-OF: R-2500
19cb0 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65  8-21688 The size
19cc0 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20   of a page is a 
19cd0 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20  power of two.   
19ce0 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20   ** between 512 
19cf0 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73  and 65536 inclus
19d00 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ive. */.    if( 
19d10 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
19d20 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
19d30 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
19d40 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
19d50 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
19d60 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
19d70 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19d80 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19d90 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19da0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
19db0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  0 );.    /* EVID
19dc0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30  ENCE-OF: R-59310
19dd0 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65  -51205 The "rese
19de0 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65  rved space" size
19df0 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20   in the 1-byte. 
19e00 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74     ** integer at
19e10 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68   offset 20 is th
19e20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19e30 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
19e40 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20  e end of.    ** 
19e50 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73  each page to res
19e60 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69  erve for extensi
19e70 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ons. .    **.   
19e80 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
19e90 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
19ea0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
19eb0 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
19ec0 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
19ed0 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
19ee0 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
19ef0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
19f00 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
19f10 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
19f20 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
19f30 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c  er. */.    usabl
19f40 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
19f50 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
19f60 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
19f70 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
19f80 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
19f90 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
19fa0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
19fb0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
19fc0 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
19fd0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
19fe0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
19ff0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
1a000 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
1a010 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
1a020 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
1a030 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
1a040 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
1a050 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
1a060 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
1a070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a080 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
1a090 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
1a0a0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
1a0b0 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
1a0c0 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
1a0d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a0e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1a0f0 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
1a100 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
1a110 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
1a120 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
1a130 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
1a140 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
1a150 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1a160 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
1a170 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
1a180 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
1a190 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
1a1c0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
1a1d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a1e0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
1a1f0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1a200 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
1a210 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
1a220 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
1a230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1a240 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1a250 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a260 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1a270 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a280 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34  F: R-28312-64704
1a290 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73   However, the us
1a2a0 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  able size is not
1a2b0 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20   allowed to.    
1a2c0 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ** be less than 
1a2d0 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  480. In other wo
1a2e0 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65  rds, if the page
1a2f0 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68   size is 512, th
1a300 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
1a310 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a  served space siz
1a320 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20  e cannot exceed 
1a330 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75  32. */.    if( u
1a340 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b  sableSize<480 ){
1a350 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a360 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a370 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
1a380 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1a390 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
1a3a0 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
1a3b0 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
1a3c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1a3d0 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
1a3e0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
1a3f0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
1a400 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
1a410 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1a420 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
1a430 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
1a440 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
1a450 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
1a460 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
1a470 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
1a480 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
1a490 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
1a4a0 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
1a4b0 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
1a4c0 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
1a4d0 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
1a4e0 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
1a4f0 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
1a500 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
1a510 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
1a520 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
1a530 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
1a540 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
1a550 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
1a560 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
1a570 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
1a580 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
1a590 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
1a5a0 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
1a5b0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
1a5c0 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
1a5d0 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
1a5e0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
1a5f0 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
1a600 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
1a610 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65  te pointer, a he
1a620 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
1a630 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
1a640 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
1a650 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
1a660 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
1a670 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
1a680 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
1a690 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
1a6a0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
1a6b0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1a6c0 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
1a6d0 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
1a6e0 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  minLocal = (u16)
1a6f0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
1a700 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
1a710 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  3);.  pBt->maxLe
1a720 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  af = (u16)(pBt->
1a730 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29  usableSize - 35)
1a740 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
1a750 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1a760 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
1a770 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66  /255 - 23);.  if
1a780 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e  ( pBt->maxLocal>
1a790 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  127 ){.    pBt->
1a7a0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
1a7b0 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 127;.  }else{.
1a7c0 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
1a7d0 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70  ePayload = (u8)p
1a7e0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
1a7f0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1a800 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
1a810 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
1a820 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
1a830 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
1a840 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
1a850 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1a860 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
1a870 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
1a880 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
1a890 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
1a8a0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1a8b0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
1a8c0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
1a8d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a8e0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
1a8f0 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
1a900 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
1a910 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
1a920 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
1a930 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
1a940 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
1a950 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
1a960 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
1a970 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
1a980 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
1a990 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
1a9a0 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
1a9b0 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
1a9c0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
1a9d0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
1a9e0 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
1a9f0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
1aa00 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
1aa10 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
1aa20 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
1aa30 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73   database.  Curs
1aa40 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
1aa50 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
1aa60 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
1aa70 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
1aa80 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
1aa90 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
1aaa0 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
1aab0 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
1aac0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
1aad0 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
1aae0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
1aaf0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1ab00 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
1ab10 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1ab20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70  (wrOnly==0 || (p
1ab30 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
1ab40 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21  BTCF_WriteFlag)!
1ab50 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72  =0).     && pCur
1ab60 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
1ab70 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
1ab80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
1ab90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1aba0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
1abb0 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
1abc0 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
1abd0 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
1abe0 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
1abf0 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
1ac00 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
1ac10 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
1ac20 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1ac30 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
1ac40 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1ac50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
1ac60 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
1ac70 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
1ac80 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
1ac90 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
1aca0 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
1acb0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
1acc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1acd0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1ace0 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
1acf0 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
1ad00 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
1ad10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ad20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ad30 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1ad40 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1ad50 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
1ad60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1ad70 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
1ad80 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
1ad90 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ada0 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
1adb0 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
1adc0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1add0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1ade0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1adf0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
1ae00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1ae10 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
1ae20 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
1ae30 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
1ae40 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
1ae50 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
1ae60 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
1ae70 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
1ae80 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
1ae90 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
1aea0 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
1aeb0 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
1aec0 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
1aed0 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
1aee0 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
1aef0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1af00 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
1af10 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
1af20 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
1af30 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
1af40 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
1af50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1af60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1af70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1af80 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
1af90 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
1afa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1afb0 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
1afc0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
1afd0 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
1afe0 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
1aff0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
1b000 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
1b010 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1b020 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b030 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
1b040 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
1b050 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
1b060 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
1b070 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1b080 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
1b090 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
1b0a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
1b0b0 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1b0c0 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
1b0d0 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
1b0e0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
1b0f0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
1b100 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
1b110 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
1b120 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
1b130 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1b140 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
1b150 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
1b160 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
1b170 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
1b180 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
1b190 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
1b1a0 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
1b1b0 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
1b1c0 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
1b1d0 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
1b1e0 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
1b1f0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
1b200 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
1b210 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1b220 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1b230 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
1b240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b250 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
1b260 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1b270 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
1b280 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
1b290 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
1b2a0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1b2b0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
1b2c0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1b2d0 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
1b2e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1b2f0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1b300 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
1b310 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
1b320 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
1b330 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
1b340 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
1b350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b360 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1b370 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1b380 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b390 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
1b3a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
1b3b0 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
1b3c0 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
1b3d0 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
1b3e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b3f0 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
1b400 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1b410 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1b420 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1b430 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
1b440 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1b450 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1b460 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
1b470 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
1b480 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
1b490 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
1b4a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b4b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1b4c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
1b4d0 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
1b4e0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
1b4f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b500 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
1b510 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1b520 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
1b530 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
1b540 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
1b550 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1b560 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1b570 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
1b580 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
1b590 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1b5a0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
1b5b0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
1b5c0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
1b5d0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1b5e0 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
1b5f0 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
1b600 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
1b610 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
1b620 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
1b630 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
1b640 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
1b650 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
1b660 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
1b670 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
1b680 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1b690 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b6a0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1b6b0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1b6c0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
1b6d0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1b6e0 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
1b6f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1b700 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
1b710 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
1b720 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1b730 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
1b740 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b750 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
1b760 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b770 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
1b780 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b790 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1b7a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b7b0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
1b7c0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b7d0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
1b7e0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b7f0 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
1b800 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b810 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
1b820 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
1b830 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
1b840 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
1b850 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
1b860 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
1b870 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
1b880 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
1b890 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
1b8a0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1b8b0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
1b8c0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
1b8d0 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
1b8e0 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
1b8f0 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
1b900 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1b910 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
1b920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1b930 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
1b940 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1b950 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
1b960 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1b970 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
1b980 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
1b990 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
1b9a0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
1b9b0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
1b9c0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
1b9d0 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
1b9e0 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1b9f0 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
1ba00 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
1ba10 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
1ba20 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
1ba30 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
1ba40 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1ba50 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
1ba60 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
1ba70 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
1ba80 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
1ba90 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
1baa0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
1bab0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
1bac0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
1bad0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
1bae0 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
1baf0 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
1bb00 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
1bb10 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1bb20 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
1bb30 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
1bb40 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
1bb50 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
1bb60 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1bb70 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
1bb80 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
1bb90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1bba0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1bbb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bbc0 20 69 6e 74 20 62 43 6f 6e 63 75 72 72 65 6e 74   int bConcurrent
1bbd0 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63   = (p->db->bConc
1bbe0 75 72 72 65 6e 74 20 26 26 20 21 49 53 41 55 54  urrent && !ISAUT
1bbf0 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73 71 6c  OVACUUM);..  sql
1bc00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bc10 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1bc20 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1bc30 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1bc40 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1bc50 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1bc60 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1bc70 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1bc80 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1bc90 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1bca0 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1bcb0 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1bcc0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1bcd0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1bce0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1bcf0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1bd00 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1bd10 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1bd20 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1bd30 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1bd40 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1bd50 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1bd60 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1bd70 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1bd80 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
1bd90 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
1bda0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
1bdb0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
1bdc0 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
1bdd0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1bde0 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
1bdf0 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
1be00 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1be10 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
1be20 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
1be30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1be40 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1be50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  {.    sqlite3 *p
1be60 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f  Block = 0;.    /
1be70 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
1be80 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
1be90 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
1bea0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
1beb0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ion .    ** on t
1bec0 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
1bed0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1bee0 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
1bef0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20  ansaction is.   
1bf00 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
1bf10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1bf20 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  KED..    */.    
1bf30 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
1bf40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bf50 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
1bf60 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74       || (pBt->bt
1bf70 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
1bf80 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a  DING)!=0.    ){.
1bf90 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1bfa0 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
1bfb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
1bfc0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
1bfd0 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1bfe0 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d        for(pIter=
1bff0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1c000 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1c010 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
1c020 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1c030 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1c040 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
1c050 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
1c060 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c080 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c090 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73  Block ){.      s
1c0a0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
1c0b0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
1c0c0 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63  Block);.      rc
1c0d0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1c0e0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1c0f0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1c100 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egun;.    }.  }.
1c110 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
1c120 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
1c130 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
1c140 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
1c150 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
1c160 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
1c170 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
1c180 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
1c190 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
1c1a0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
1c1b0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
1c1c0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
1c1d0 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
1c1e0 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
1c1f0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1c200 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
1c210 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
1c220 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1c230 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1c240 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
1c250 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
1c260 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
1c270 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
1c280 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1c290 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
1c2a0 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
1c2b0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
1c2c0 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
1c2d0 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
1c2e0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
1c2f0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
1c300 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
1c310 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1c320 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
1c330 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
1c340 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1c350 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
1c360 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
1c370 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
1c380 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
1c390 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
1c3a0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1c3b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c3c0 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
1c3d0 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
1c3e0 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
1c3f0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
1c400 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
1c410 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
1c420 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
1c430 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
1c440 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
1c450 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
1c460 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
1c470 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
1c480 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
1c490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c4a0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1c4b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
1c4c0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1c4d0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
1c4e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c4f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1c500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c510 20 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d      int exFlag =
1c520 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d   bConcurrent ? -
1c530 31 20 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a  1 : (wrflag>1);.
1c540 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c550 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1c560 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c  Bt->pPager, exFl
1c570 61 67 2c 20 73 71 6c 69 74 65 33 54 65 6d 70 49  ag, sqlite3TempI
1c580 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
1c590 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c5b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
1c5c0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1c5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c5e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1c5f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c600 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
1c610 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1c620 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
1c630 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
1c640 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
1c650 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c660 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
1c670 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
1c680 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
1c690 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
1c6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c6b0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1c6c0 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1c6d0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1c6e0 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
1c6f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c700 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1c710 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
1c720 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
1c730 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
1c740 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
1c750 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
1c760 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1c770 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
1c780 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
1c790 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
1c7a0 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
1c7b0 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
1c7c0 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
1c7d0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1c7e0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
1c7f0 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
1c800 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
1c810 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1c820 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
1c830 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
1c840 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1c850 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
1c860 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1c870 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
1c880 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1c890 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
1c8a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1c8b0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1c8c0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
1c8d0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
1c8e0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
1c8f0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
1c900 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
1c910 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1c920 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
1c930 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1c940 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
1c950 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1c960 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
1c970 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
1c980 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
1c990 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
1c9a0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
1c9b0 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
1c9c0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1c9d0 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
1c9e0 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
1c9f0 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
1ca00 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
1ca10 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
1ca20 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
1ca30 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
1ca40 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
1ca50 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
1ca60 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
1ca70 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
1ca80 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
1ca90 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
1caa0 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
1cab0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1cac0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
1cad0 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
1cae0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
1caf0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cb00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1cb10 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1cb20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1cb30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cb40 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1cb50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1cb60 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1cb70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1cb80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cb90 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
1cba0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cbb0 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
1cbc0 20 69 66 28 20 62 43 6f 6e 63 75 72 72 65 6e 74   if( bConcurrent
1cbd0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1cbe0 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65  K && sqlite3Page
1cbf0 72 49 73 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  rIsWal(pBt->pPag
1cc00 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
1cc10 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1cc20 6e 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d  nConcurrent(pBt-
1cc30 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1cc40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cc50 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1cc60 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
1cc70 6d 61 70 41 6c 6c 6f 63 61 74 65 28 70 42 74 29  mapAllocate(pBt)
1cc80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1cc90 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  if..  if( rc==SQ
1cca0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1ccb0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
1ccc0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1ccd0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1cce0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1ccf0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
1cd00 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1cd10 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1cd20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1cd30 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1cd40 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1cd50 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1cd60 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1cd70 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1cd80 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
1cd90 20 20 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69      int nSavepoi
1cda0 6e 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  nt = p->db->nSav
1cdb0 65 70 6f 69 6e 74 3b 0a 20 20 20 20 72 63 20 3d  epoint;.    rc =
1cdc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1cdd0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1cde0 70 50 61 67 65 72 2c 20 6e 53 61 76 65 70 6f 69  pPager, nSavepoi
1cdf0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1ce00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53  =SQLITE_OK && nS
1ce10 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
1ce20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d    rc = btreePtrm
1ce30 61 70 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61  apBegin(pBt, nSa
1ce40 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
1ce50 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1ce60 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
1ce70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ce80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ce90 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1cea0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ceb0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1cec0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1ced0 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
1cee0 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
1cef0 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
1cf00 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
1cf10 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
1cf20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1cf30 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
1cf40 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
1cf50 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
1cf60 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
1cf70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cf80 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1cf90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1cfa0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1cfd0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
1cfe0 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1d010 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
1d020 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d050 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1d060 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d070 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
1d080 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
1d090 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
1d0a0 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
1d0b0 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
1d0c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d0d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1d0e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1d0f0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1d100 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1d110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d120 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
1d130 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
1d140 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
1d150 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
1d160 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1d170 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1d180 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1d190 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
1d1a0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
1d1b0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
1d1c0 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
1d1d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1d1e0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1d1f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
1d200 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
1d210 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1d220 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1d230 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1d240 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d250 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1d260 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1d270 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1d280 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d290 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1d2a0 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
1d2b0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1d2c0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1d2d0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73  no, &rc);.  }..s
1d2e0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
1d2f0 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
1d300 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
1d310 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
1d320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
1d330 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
1d340 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
1d350 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
1d360 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
1d370 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
1d380 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
1d390 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
1d3a0 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
1d3b0 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
1d3c0 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
1d3d0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
1d3e0 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
1d3f0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1d400 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1d410 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
1d420 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
1d430 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1d440 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
1d450 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1d460 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
1d470 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1d480 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1d490 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4b0 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
1d4c0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
1d4d0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
1d4e0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1d4f0 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
1d500 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
1d510 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1d520 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
1d530 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d540 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
1d550 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
1d560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1d570 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1d580 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1d590 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
1d5a0 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
1d5b0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1d5c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d5d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1d5e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1d5f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1d600 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1d610 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1d620 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1d630 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
1d640 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
1d650 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
1d660 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
1d670 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1d680 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
1d690 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1d6a0 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
1d6b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d6c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1d6d0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
1d6e0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1d6f0 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1d700 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
1d710 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
1d720 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
1d730 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1d740 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1d750 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1d760 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1d770 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1d780 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1d790 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1d7a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1d7b0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1d7c0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1d7d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1d7e0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1d7f0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1d800 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1d810 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1d820 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1d830 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1d840 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1d850 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1d860 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1d870 61 64 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ad.         && p
1d880 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1d890 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b  1<=pPage->aData+
1d8a0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a  pPage->maskPage.
1d8b0 20 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f           && iFro
1d8c0 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c  m==get4byte(pCel
1d8d0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 0a  l+info.nSize-4).
1d8e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1d8f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1d900 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1d910 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1d920 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d930 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1d940 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
1d950 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
1d960 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
1d970 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
1d980 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1d990 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1d9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d9b0 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
1d9c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
1d9d0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
1d9e0 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
1d9f0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
1da00 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1da10 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
1da20 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1da30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1da40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1da50 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
1da60 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1da70 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1da80 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
1da90 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
1daa0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
1dab0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
1dac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1dad0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
1dae0 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
1daf0 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
1db00 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
1db10 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
1db20 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
1db30 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
1db40 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
1db50 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
1db60 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1db70 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
1db80 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1db90 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
1dba0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
1dbb0 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
1dbc0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1dbd0 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
1dbe0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
1dbf0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
1dc00 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
1dc10 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
1dc20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
1dc30 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
1dc40 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
1dc50 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1dc60 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
1dc70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
1dc80 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
1dc90 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
1dca0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dcc0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
1dcd0 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
1dce0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1dcf0 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
1dd00 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1dd10 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
1dd20 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1dd30 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
1dd40 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
1dd50 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
1dd60 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
1dd70 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1dd80 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
1dd90 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
1dda0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1ddb0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
1ddc0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
1ddd0 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
1dde0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
1ddf0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1de00 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
1de10 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
1de20 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
1de30 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1de40 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
1de50 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1de60 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1de70 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
1de80 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1de90 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
1dea0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1deb0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1dec0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
1ded0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1dee0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1def0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1df00 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
1df10 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
1df20 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
1df30 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
1df40 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
1df50 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
1df60 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
1df70 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
1df80 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
1df90 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
1dfa0 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
1dfb0 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
1dfc0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
1dfd0 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
1dfe0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1dff0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
1e000 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
1e010 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1e020 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
1e030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e040 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1e050 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
1e060 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
1e070 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
1e080 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
1e090 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
1e0a0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
1e0b0 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
1e0c0 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
1e0d0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1e0e0 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
1e0f0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1e100 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
1e110 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
1e120 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
1e130 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
1e140 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1e150 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
1e160 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
1e170 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
1e180 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
1e190 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1e1a0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1e1b0 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
1e1c0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1e1d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1e1e0 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
1e1f0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1e200 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1e210 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e220 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1e230 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1e240 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
1e250 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
1e260 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e280 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e290 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1e2a0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
1e2b0 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
1e2c0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1e2d0 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
1e2e0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1e2f0 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
1e300 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1e310 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
1e320 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
1e330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e340 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e350 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1e360 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
1e370 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
1e380 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
1e390 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
1e3a0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
1e3b0 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
1e3c0 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
1e3d0 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
1e3e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1e3f0 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
1e400 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1e410 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
1e420 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1e430 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1e440 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
1e450 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
1e460 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1e480 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e4a0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
1e4b0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1e4c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e4d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1e4e0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1e4f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e500 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1e510 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
1e520 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
1e530 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1e540 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
1e550 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1e560 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e580 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1e590 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
1e5a0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1e5b0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1e5c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e5d0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1e5e0 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
1e5f0 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
1e600 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
1e610 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1e620 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
1e630 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
1e640 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
1e650 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
1e660 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
1e670 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
1e680 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
1e690 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
1e6a0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1e6b0 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
1e6c0 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
1e6d0 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
1e6e0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
1e6f0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
1e700 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1e710 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
1e720 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1e730 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
1e740 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
1e750 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
1e760 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
1e770 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1e780 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
1e790 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
1e7a0 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
1e7b0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1e7c0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
1e7d0 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
1e7e0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
1e7f0 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
1e800 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1e810 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
1e820 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
1e830 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
1e840 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
1e850 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
1e860 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
1e870 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
1e880 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
1e890 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
1e8a0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1e8b0 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
1e8c0 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
1e8d0 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
1e8e0 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
1e8f0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1e900 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
1e910 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
1e920 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
1e930 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1e940 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
1e950 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
1e960 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
1e970 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
1e980 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1e990 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
1e9a0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1e9b0 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
1e9c0 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
1e9d0 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
1e9e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1e9f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1ea00 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
1ea10 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
1ea20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1ea30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ea40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1ea50 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
1ea60 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
1ea70 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
1ea80 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
1ea90 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
1eaa0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1eab0 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
1eac0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
1ead0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
1eae0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
1eaf0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1eb00 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
1eb10 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
1eb20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1eb30 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1eb40 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
1eb50 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
1eb60 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
1eb70 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1eb80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1eb90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1eba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ebb0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1ebc0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
1ebd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ebe0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ebf0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
1ec00 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1ec10 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
1ec20 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1ec30 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
1ec40 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1ec50 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
1ec60 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
1ec70 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
1ec80 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
1ec90 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
1eca0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
1ecb0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
1ecc0 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
1ecd0 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
1ece0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1ecf0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
1ed00 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
1ed10 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
1ed20 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
1ed30 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
1ed40 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1ed50 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
1ed60 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
1ed70 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1ed80 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1ed90 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1eda0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1edb0 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
1edc0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
1edd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ede0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1edf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ee00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ee10 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1ee20 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
1ee30 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1ee40 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1ee50 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
1ee60 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
1ee70 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
1ee80 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
1ee90 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
1eea0 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1eeb0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1eec0 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1eed0 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1eee0 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1eef0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1ef00 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1ef10 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1ef20 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1ef30 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1ef40 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1ef50 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1ef60 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1ef70 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ef80 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1ef90 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1efa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1efb0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1efc0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1efd0 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1efe0 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1eff0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1f000 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1f010 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1f020 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1f030 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1f040 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1f050 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1f060 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1f070 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
1f080 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
1f090 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1f0a0 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
1f0b0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
1f0c0 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
1f0d0 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
1f0e0 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
1f0f0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1f100 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
1f110 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
1f120 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1f130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1f140 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
1f150 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
1f160 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
1f170 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
1f180 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1f190 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1f1a0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1f1b0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1f1c0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
1f1d0 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
1f1e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f1f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f200 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f210 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1f220 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f240 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1f250 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
1f260 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
1f270 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
1f280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1f290 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
1f2a0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
1f2b0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
1f2c0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
1f2d0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
1f2e0 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
1f2f0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1f300 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1f310 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f330 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1f350 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1f360 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
1f370 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
1f380 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
1f390 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1f3a0 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
1f3b0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1f3c0 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
1f3d0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f3e0 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
1f3f0 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
1f400 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f410 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f420 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
1f430 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1f440 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1f450 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1f460 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
1f470 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
1f480 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
1f490 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
1f4a0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
1f4b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f4c0 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
1f4d0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
1f4e0 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1f4f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
1f500 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
1f510 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1f520 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
1f530 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
1f540 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
1f550 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f560 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
1f570 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
1f580 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
1f590 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1f5a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f5b0 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
1f5c0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1f5d0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1f600 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
1f610 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
1f620 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
1f630 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
1f640 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
1f650 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
1f660 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
1f670 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
1f680 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
1f690 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
1f6a0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
1f6b0 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
1f6c0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f6d0 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
1f6e0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1f6f0 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
1f700 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
1f710 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f720 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1f730 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
1f740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
1f750 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1f760 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
1f770 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1f780 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
1f790 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
1f7a0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
1f7b0 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
1f7c0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1f7d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
1f7e0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
1f7f0 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
1f800 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
1f810 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
1f820 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
1f830 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
1f840 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
1f850 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
1f860 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1f870 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1f880 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
1f890 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
1f8a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f8b0 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
1f8c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1f8d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f8e0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
1f8f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1f910 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1f920 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
1f930 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f940 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
1f950 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
1f960 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1f970 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
1f980 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
1f990 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1f9a0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
1f9b0 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
1f9c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f9d0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1f9e0 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
1f9f0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1fa00 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
1fa10 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
1fa20 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
1fa30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1fa40 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
1fa50 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
1fa60 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1fa70 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1fa80 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1fa90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1faa0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
1fab0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1fac0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1fad0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1fae0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
1faf0 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
1fb00 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1fb10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fb20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fb30 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1fb40 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1fb50 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1fb60 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1fb70 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1fb80 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1fb90 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1fba0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1fbb0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
1fbc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1fbd0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1fbe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1fbf0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1fc00 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
1fc10 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
1fc20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1fc30 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
1fc40 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
1fc50 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
1fc60 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1fc70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1fc80 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
1fc90 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1fca0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
1fcb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fcc0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
1fcd0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
1fce0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1fcf0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
1fd00 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1fd10 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
1fd20 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
1fd30 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
1fd40 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
1fd50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fd60 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1fd70 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
1fd80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1fd90 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1fda0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1fdb0 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
1fdc0 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
1fdd0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1fde0 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
1fdf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fe00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1fe10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
1fe20 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1fe30 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1fe40 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
1fe50 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
1fe60 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1fe70 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
1fe80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1fe90 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1fea0 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
1feb0 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
1fec0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
1fed0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fee0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1fef0 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
1ff00 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
1ff10 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
1ff20 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
1ff30 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1ff40 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
1ff50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1ff60 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
1ff70 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
1ff80 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1ff90 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
1ffa0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1ffb0 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
1ffc0 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
1ffd0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1ffe0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
1fff0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
20000 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
20010 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
20020 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
20030 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
20040 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
20050 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
20060 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
20070 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
20080 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
20090 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
200a0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
200b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
200c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
200d0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
200e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
200f0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20100 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
20110 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
20120 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
20130 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
20140 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
20150 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20160 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
20170 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
20180 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
20190 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
201a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
201b0 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
201c0 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
201d0 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
201e0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
201f0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
20200 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
20210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
20220 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
20230 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
20240 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
20250 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20260 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
20270 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
20280 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
20290 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
202a0 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
202b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
202c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
202d0 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
202e0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
202f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
20300 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
20310 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
20320 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
20330 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
20340 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
20350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20360 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20370 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
20380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
20390 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
203a0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
203b0 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
203c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
203d0 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
203e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
203f0 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
20400 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
20410 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
20420 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
20430 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
20440 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ENT./*.** This f
20450 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
20460 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72  d as part of mer
20470 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45  ging an CONCURRE
20480 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  NT transaction w
20490 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73  ith.** the snaps
204a0 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20  hot at the head 
204b0 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  of the wal file.
204c0 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c   It relocates al
204d0 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a  l pages in the.*
204e0 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e  * range iFirst..
204f0 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
20500 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
20510 74 68 61 74 20 74 68 65 20 42 74 72 65 65 50 74  that the BtreePt
20520 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75  rmap .** structu
20530 72 65 20 61 74 20 42 74 53 68 61 72 65 64 2e 70  re at BtShared.p
20540 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Map contains the
20550 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
20560 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63   pointers to eac
20570 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65  h.** page in the
20580 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
20590 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55   pnCurrent is NU
205a0 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  LL, then all pag
205b0 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  es in the range 
205c0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72  are moved to cur
205d0 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c  rently.** free l
205e0 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66  ocations (i.e. f
205f0 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73  ree-list entries
20600 29 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74  ) within the dat
20610 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
20620 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74  e page.** iFirst
20630 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70  ..**.** Or, if p
20640 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20  nCurrent is not 
20650 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f  NULL, then it po
20660 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20  ints to a value 
20670 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
20680 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * current size o
20690 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
206a0 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e  ile in pages. In
206b0 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20   this case, all 
206c0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c  pages are.** rel
206d0 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e  ocated to the en
206e0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
206f0 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46  e file - page iF
20700 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65  irst is relocate
20710 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70  d to.** page (*p
20720 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67  nCurrent+1), pag
20730 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61  e iFirst+1 to pa
20740 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32  ge (*pnCurrent+2
20750 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a  ), and so on..**
20760 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e   Value *pnCurren
20770 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
20780 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
20790 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
207a0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
207b0 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
207c0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
207d0 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
207e0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
207f0 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
20800 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
20810 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
20820 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20  RelocateRange(. 
20830 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c   /* B-tree handl
20860 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72  e */.  Pgno iFir
20870 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
20880 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20890 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65  page to relocate
208a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74   */.  Pgno iLast
208b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
208c0 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
208d0 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
208e0 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72  /.  Pgno *pnCurr
208f0 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ent             
20900 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
20910 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61  LL, IN/OUT: Data
20920 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  base size */.){.
20930 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20940 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72  E_OK;.  BtreePtr
20950 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
20960 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50  >pMap;.  Pgno iP
20970 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46  g;..  for(iPg=iF
20980 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74  irst; iPg<=iLast
20990 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
209a0 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d  K; iPg++){.    M
209b0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20  emPage *pFree = 
209c0 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61  0;     /* Page a
209d0 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72  llocated from fr
209e0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d  ee-list */.    M
209f0 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
20a00 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20  .    Pgno iNew; 
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a20 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  New page number 
20a30 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50  for pPg */.    P
20a40 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
20a50 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ry;    /* Pointe
20a60 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
20a70 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20  page iPg */..   
20a80 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e   if( iPg==PENDIN
20a90 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20aa0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20ab0 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d   pEntry = &pMap-
20ac0 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70  >aPtr[iPg - pMap
20ad0 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20  ->iFirst];..    
20ae0 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  if( pEntry->eTyp
20af0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
20b00 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  GE ){.      Pgno
20b10 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63   dummy;.      rc
20b20 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
20b30 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
20b40 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42  , &dummy, iPg, B
20b50 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
20b60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20b70 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 61  (pFree);.      a
20b80 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20b90 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69  E_OK || dummy==i
20ba0 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Pg );.    }else 
20bb0 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b  if( pnCurrent ){
20bc0 0a 20 20 20 20 20 20 62 74 72 65 65 47 65 74 50  .      btreeGetP
20bd0 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70  age(pBt, iPg, &p
20be0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  Pg, 0);.      as
20bf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
20c00 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
20c10 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  g->pDbPage) );. 
20c20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
20c30 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
20c40 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61  count(pPg->pDbPa
20c50 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ge)==1 );.      
20c60 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
20c70 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rent);.      if(
20c80 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42   iNew==PENDING_B
20c90 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
20ca0 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
20cb0 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  rent);.      rc 
20cc0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
20cd0 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d  Bt, pPg, pEntry-
20ce0 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e  >eType, pEntry->
20cf0 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29  parent, iNew, 1)
20d00 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
20d10 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  ageNotNull(pPg);
20d20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20d30 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
20d40 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
20d50 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69  Free, &iNew, iFi
20d60 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c  rst-1, BTALLOC_L
20d70 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  E);.      assert
20d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20d90 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29  || iNew<iFirst )
20da0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20dc0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
20dd0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  g = 0;.        r
20de0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
20df0 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  );.        btree
20e00 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 67  GetPage(pBt, iPg
20e10 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
20e20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
20e30 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c 20  ePage(pBt, pPg, 
20e40 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20 70  pEntry->eType, p
20e50 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69 4e  Entry->parent,iN
20e60 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ew,1);.        r
20e70 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
20e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20e90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20ea0 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  }../* !defined(S
20eb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
20ec0 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 65  RRENT).**.** The
20ed0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 70   b-tree handle p
20ee0 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
20ef0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  y argument is ab
20f00 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61 6e  out to commit an
20f10 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20 74  .** CONCURRENT t
20f20 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 74  ransaction. At t
20f30 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 20  his point it is 
20f40 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
20f50 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73 73  this is .** poss
20f60 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20 57  ible - the wal W
20f70 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68 65  RITER lock is he
20f80 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e 6f  ld and it is kno
20f90 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61 72  wn that there ar
20fa0 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69 63  e .** no conflic
20fb0 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74 65  ts with committe
20fc0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
20fd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
20fe0 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 42  reeFixUnlocked(B
20ff0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
21000 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21010 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
21020 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
21030 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d 20  ge1;.  u8 *p1 = 
21040 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
21050 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21060 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
21070 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21080 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61 67  OK;..  /* If pag
21090 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
210a0 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74 61  ase is not writa
210b0 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61 67  ble, then no pag
210c0 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65  es were allocate
210d0 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64 20  d.  ** or freed 
210e0 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  by this transact
210f0 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
21100 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61 6e  e no special han
21110 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 72  dling is .  ** r
21120 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
21130 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69 73  se, if page 1 is
21140 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64 2e   dirty, proceed.
21150 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72 6d    */.  BtreePtrm
21160 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
21170 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54 72  pMap;.  Pgno iTr
21180 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
21190 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f 20  p1[32]);.  Pgno 
211a0 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  nPage = btreePag
211b0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 75  ecount(pBt);.  u
211c0 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  32 nFree = get4b
211d0 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20  yte(&p1[36]);.. 
211e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 4d   assert( pBt->pM
211f0 61 70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ap );.  rc = sql
21200 69 74 65 33 50 61 67 65 72 55 70 67 72 61 64 65  ite3PagerUpgrade
21210 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 2c  Snapshot(pPager,
21220 20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65   pPage1->pDbPage
21230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3d  );.  assert( p1=
21240 3d 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  =pPage1->aData )
21250 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
21260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
21270 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67 65 74 34  no nHPage = get4
21280 62 79 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a 20  byte(&p1[28]);. 
21290 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 6e     Pgno nFin = n
212a0 48 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 2f  HPage;         /
212b0 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 61 66 74  * Size of db aft
212c0 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  er transaction m
212d0 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28  erge */..    if(
212e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
212f0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
21300 3e 70 44 62 50 61 67 65 29 20 29 7b 0a 20 20 20  >pDbPage) ){.   
21310 20 20 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b 20     Pgno iHTrunk 
21320 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33  = get4byte(&p1[3
21330 32 5d 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e  2]);.      u32 n
21340 48 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  HFree = get4byte
21350 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20 20  (&p1[36]);..    
21360 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
21370 68 65 61 64 20 64 61 74 61 62 61 73 65 20 66 72  head database fr
21380 65 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 65  ee list to the e
21390 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
213a0 74 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  t.      ** trans
213b0 61 63 74 69 6f 6e 73 20 66 72 65 65 2d 6c 69 73  actions free-lis
213c0 74 20 28 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a  t (if any).  */.
213d0 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
213e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
213f0 75 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 2c  ut4byte(&p1[36],
21400 20 6e 48 46 72 65 65 20 2b 20 6e 46 72 65 65 29   nHFree + nFree)
21410 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
21420 74 65 28 26 70 31 5b 33 32 5d 2c 20 69 54 72 75  te(&p1[32], iTru
21430 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  nk);.        whi
21440 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b 0a 20 20  le( iTrunk ){.  
21450 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
21460 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69 74 65 33  pTrunk = sqlite3
21470 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
21480 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20  er, iTrunk);.   
21490 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
214a0 67 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 54  get4byte((u8*)pT
214b0 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b 0a 20 20  runk->pData);.  
214c0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 72 75          if( iTru
214d0 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nk==0 ){.       
214e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 28 75       put4byte((u
214f0 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61  8*)pTrunk->pData
21500 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20 20 20 20  , iHTrunk);.    
21510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21520 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
21530 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20  ref(pTrunk);.   
21540 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a       };.      }.
21550 0a 20 20 20 20 20 20 69 66 28 20 6e 48 50 61 67  .      if( nHPag
21560 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d  e<(pMap->iFirst-
21570 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
21580 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
21590 6e 73 69 73 74 65 64 20 6f 66 20 28 70 4d 61 70  nsisted of (pMap
215a0 2d 3e 69 46 69 72 73 74 2d 31 29 20 70 61 67 65  ->iFirst-1) page
215b0 73 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  s when the curre
215c0 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  nt.        ** co
215d0 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63  ncurrent transac
215e0 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
215f0 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75 72 72 65   And an concurre
21600 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  nt transaction m
21610 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ay.        ** no
21620 74 20 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e  t be executed on
21630 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
21640 64 61 74 61 62 61 73 65 20 2d 20 73 6f 20 74 68  database - so th
21650 65 20 64 62 20 73 68 6f 75 6c 64 20 0a 20 20 20  e db should .   
21660 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65       ** not have
21670 20 73 68 72 75 6e 6b 20 73 69 6e 63 65 20 74 68   shrunk since th
21680 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
21690 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 72 65 66  s opened. Theref
216a0 6f 72 65 20 6e 48 50 61 67 65 0a 20 20 20 20 20  ore nHPage.     
216b0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
216c0 73 65 74 20 74 6f 20 28 70 4d 61 70 2d 3e 69 46  set to (pMap->iF
216d0 69 72 73 74 2d 31 29 20 6f 72 20 67 72 65 61 74  irst-1) or great
216e0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  er. */.        r
216f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
21700 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
21710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
21720 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   The current tra
21730 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  nsaction allocat
21740 65 64 20 70 61 67 65 73 20 70 4d 61 70 2d 3e 69  ed pages pMap->i
21750 46 69 72 73 74 20 74 68 72 6f 75 67 68 0a 20 20  First through.  
21760 20 20 20 20 20 20 2a 2a 20 6e 50 61 67 65 20 28        ** nPage (
21770 69 6e 63 6c 75 73 69 76 65 29 20 61 74 20 74 68  inclusive) at th
21780 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
21790 61 62 61 73 65 20 66 69 6c 65 2e 20 4d 65 61 6e  abase file. Mean
217a0 77 68 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a  while,.        *
217b0 2a 20 6f 74 68 65 72 20 74 72 61 6e 73 61 63 74  * other transact
217c0 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c 6f 63 61  ions have alloca
217d0 74 65 64 20 28 69 46 69 72 73 74 2e 2e 6e 48 50  ted (iFirst..nHP
217e0 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65 0a 20 20  age). So move.  
217f0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 28        ** pages (
21800 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e 50 61 67  iFirst..MIN(nPag
21810 65 2c 6e 48 50 61 67 65 29 29 20 74 6f 20 28 4d  e,nHPage)) to (M
21820 41 58 28 6e 50 61 67 65 2c 6e 48 50 61 67 65 29  AX(nPage,nHPage)
21830 2b 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  +1).  */.       
21840 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20 4d 49   Pgno iLast = MI
21850 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29  N(nPage, nHPage)
21860 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67  ;    /* Last pag
21870 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 20  e to move */.   
21880 20 20 20 20 20 50 67 6e 6f 20 6e 43 75 72 72 65       Pgno nCurre
21890 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
218a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
218b0 65 6e 74 20 73 69 7a 65 20 6f 66 20 64 62 20 2a  ent size of db *
218c0 2f 0a 20 20 20 20 20 20 20 20 6e 43 75 72 72 65  /.        nCurre
218d0 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67 65 2c 20  nt = MAX(nPage, 
218e0 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  nHPage);.       
218f0 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63   rc = btreeReloc
21900 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 70 4d  ateRange(pBt, pM
21910 61 70 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73  ap->iFirst, iLas
21920 74 2c 20 26 6e 43 75 72 72 65 6e 74 29 3b 0a 0a  t, &nCurrent);..
21930 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
21940 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63 6f 6c 6c   are now no coll
21950 69 73 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20  isions with the 
21960 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68 65 20  snapshot at the 
21970 68 65 61 64 20 6f 66 20 74 68 65 0a 20 20 20 20  head of the.    
21980 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
21990 66 69 6c 65 2e 20 53 6f 20 61 74 20 74 68 69 73  file. So at this
219a0 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
219b0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 77  be possible to w
219c0 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  rite.        ** 
219d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
219e0 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 42 65 66  out to disk. Bef
219f0 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20 74 68 6f  ore doing so tho
21a00 75 67 68 2c 20 61 74 74 65 6d 70 74 20 74 6f 0a  ugh, attempt to.
21a10 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6c 6f 63          ** reloc
21a20 61 74 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ate some of the 
21a30 6e 65 77 20 70 61 67 65 73 20 74 6f 20 66 72 65  new pages to fre
21a40 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68  e locations with
21a50 69 6e 20 74 68 65 20 62 6f 64 79 0a 20 20 20 20  in the body.    
21a60 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61      ** of the da
21a70 74 61 62 61 73 65 20 66 69 6c 65 20 28 69 2e 65  tabase file (i.e
21a80 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72  . free-list entr
21a90 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ies). */.       
21aa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21ac0 61 73 73 65 72 74 28 20 6e 43 75 72 72 65 6e 74  assert( nCurrent
21ad0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
21ae0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
21af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
21b00 65 72 53 65 74 44 62 73 69 7a 65 28 70 42 74 2d  erSetDbsize(pBt-
21b10 3e 70 50 61 67 65 72 2c 20 6e 43 75 72 72 65 6e  >pPager, nCurren
21b20 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 46  t);.          nF
21b30 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
21b40 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 20  p1[36]);.       
21b50 20 20 20 6e 46 69 6e 20 3d 20 4d 41 58 28 6e 43     nFin = MAX(nC
21b60 75 72 72 65 6e 74 2d 6e 46 72 65 65 2c 20 6e 48  urrent-nFree, nH
21b70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
21b80 20 69 66 28 20 6e 43 75 72 72 65 6e 74 3e 50 45   if( nCurrent>PE
21b90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21ba0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45  pBt) && nFin<=PE
21bb0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21bc0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
21bd0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
21be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21bf0 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f    rc = btreeRelo
21c00 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 6e  cateRange(pBt, n
21c10 46 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74 2c  Fin+1, nCurrent,
21c20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   0);.        }..
21c30 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
21c40 28 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  (&p1[28], nFin);
21c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21c60 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
21c70 65 74 44 62 73 69 7a 65 28 70 50 61 67 65 72 2c  etDbsize(pPager,
21c80 20 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72   nFin);.  }..  r
21c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
21ca0 65 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  e.# define btree
21cb0 46 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20 20  FixUnlocked(X)  
21cc0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
21cd0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
21ce0 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f  CONCURRENT */../
21cf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21d00 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
21d10 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
21d20 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
21d30 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
21d40 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
21d50 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
21d60 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
21d70 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
21d80 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
21d90 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
21da0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
21db0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
21dc0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
21dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
21de0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
21df0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
21e00 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
21e10 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
21e20 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
21e30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
21e40 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
21e50 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
21e60 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
21e70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
21e80 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
21e90 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
21ea0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
21eb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
21ed0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
21ee0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
21ef0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
21f00 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
21f10 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
21f20 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
21f30 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
21f40 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
21f50 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
21f60 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
21f70 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
21f80 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
21f90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
21fa0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
21fb0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
21fc0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
21fd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
21fe0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
21ff0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
22000 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
22010 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
22020 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
22030 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
22040 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
22050 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
22060 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
22070 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
22080 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
22090 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
220a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
220b0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
220c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
220d0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
220e0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
220f0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
22100 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
22110 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
22120 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
22130 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
22140 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
22150 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
22160 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
22170 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
22180 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
22190 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
221a0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
221b0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
221c0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
221d0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
221e0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
221f0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
22200 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
22210 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
22220 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
22230 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
22240 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22250 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
22260 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
22270 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
22280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22290 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
222a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
222b0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
222c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
222d0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
222e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69  reeEnter(p);..#i
222f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22300 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
22310 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
22320 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61 73  cuum ){.      as
22330 73 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52 45  sert( ISCONCURRE
22340 4e 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  NT==0 );.      r
22350 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
22360 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
22370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
22390 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
223a0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
223b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
223c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
223d0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
223e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
223f0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
22400 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
22410 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
22420 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
22430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22440 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 7b   ISCONCURRENT ){
22450 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
22460 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29 3b  eFixUnlocked(p);
22470 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
224a0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
224b0 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
224c0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
224d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
224e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
224f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
22510 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22520 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
22530 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
22540 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
22550 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
22560 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
22570 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
22580 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
22590 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
225a0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
225b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
225c0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
225d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
225e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
225f0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
22600 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
22610 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22620 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
22630 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
22640 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
22650 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
22660 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
22670 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
22680 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
22690 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
226a0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
226b0 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
226c0 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
226d0 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
226e0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
226f0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
22700 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
22710 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
22720 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
22730 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
22740 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
22750 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
22760 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
22770 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
22780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
22790 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
227a0 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
227b0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
227c0 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
227d0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
227e0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
227f0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
22800 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22810 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
22820 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
22830 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
22840 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
22850 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
22860 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
22870 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
22880 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
22890 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
228a0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
228b0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
228c0 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
228d0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
228e0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
228f0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
22900 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
22910 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
22920 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
22930 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
22940 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
22950 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
22960 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
22970 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
22980 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
22990 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
229a0 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
229b0 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
229c0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
229d0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
229e0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
229f0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
22a00 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
22a10 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
22a20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
22a30 20 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52 45   was an CONCURRE
22a40 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  NT transaction, 
22a50 64 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d 3e  delete the pBt->
22a60 70 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  pMap object..  *
22a70 2a 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67 65  * Also call Page
22a80 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 29  rEndConcurrent()
22a90 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
22aa0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 64 69  the pager has di
22ab0 73 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68 65  scarded.  ** the
22ac0 20 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20 70   record of all p
22ad0 61 67 65 73 20 72 65 61 64 20 77 69 74 68 69 6e  ages read within
22ae0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22af0 2e 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74 72  .  */.  btreePtr
22b00 6d 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b 0a  mapDelete(pBt);.
22b10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e    sqlite3PagerEn
22b20 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d  dConcurrent(pBt-
22b30 3e 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72 65  >pPager);.  btre
22b40 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
22b50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
22b60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
22b70 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
22b80 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
22b90 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
22ba0 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
22bb0 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
22bc0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
22bd0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
22be0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
22bf0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
22c00 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
22c10 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
22c20 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
22c30 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
22c40 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
22c50 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
22c60 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
22c70 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
22c80 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
22c90 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
22ca0 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
22cb0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
22cc0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
22cd0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
22ce0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
22cf0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
22d00 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
22d10 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
22d20 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
22d30 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
22d40 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
22d50 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
22d60 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
22d70 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
22d80 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
22d90 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
22da0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
22db0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
22dc0 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
22dd0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
22de0 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
22df0 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
22e00 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
22e10 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
22e20 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
22e30 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
22e40 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
22e50 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
22e60 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
22e70 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
22e80 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
22e90 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
22ea0 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
22eb0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
22ec0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
22ed0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
22ee0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
22ef0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
22f00 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
22f10 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
22f20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
22f30 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
22f40 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
22f50 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
22f60 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
22f70 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
22f80 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
22f90 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
22fa0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
22fb0 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
22fc0 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
22fd0 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
22fe0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
22ff0 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
23000 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
23010 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
23020 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
23030 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
23040 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
23050 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
23060 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
23070 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
23080 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
23090 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
230a0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
230b0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
230c0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
230d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
230e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
230f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
23100 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
23110 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
23120 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
23130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
23140 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23150 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
23160 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
23170 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
23180 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
23190 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
231a0 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
231b0 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
231c0 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
231d0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
231e0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
231f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
23200 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
23210 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
23220 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
23230 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
23240 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
23250 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
23260 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
23270 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
23280 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
23290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
232a0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
232b0 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
232c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
232d0 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
232e0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
232f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23300 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
23310 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
23320 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
23330 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
23340 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
23350 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
23360 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
23370 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
23380 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
23390 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
233a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
233b0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
233c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
233d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
233e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
233f0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
23400 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
23410 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
23420 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
23430 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
23440 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
23450 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
23460 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
23470 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
23480 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
23490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
234a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
234b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
234c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
234d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
234e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
234f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
23500 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
23510 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
23520 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
23530 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
23540 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
23550 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
23560 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
23570 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
23580 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
23590 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
235a0 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
235b0 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
235c0 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
235d0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
235e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
235f0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
23600 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
23610 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
23620 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
23630 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
23640 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
23650 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
23660 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
23670 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
23680 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
23690 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
236a0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
236b0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
236c0 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
236d0 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
236e0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
236f0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
23700 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
23710 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
23720 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
23730 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
23740 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
23750 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
23760 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
23770 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
23780 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
23790 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
237a0 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
237b0 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
237c0 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
237d0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
237e0 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
237f0 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
23800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
23810 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
23820 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
23830 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
23840 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
23850 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
23860 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
23870 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
23880 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
23890 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
238a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
238b0 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
238c0 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
238d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
238e0 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
238f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
23900 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
23910 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
23920 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
23930 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
23940 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
23950 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
23960 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23970 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
23980 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
23990 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
239a0 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
239b0 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
239c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
239d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
239e0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
239f0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
23a00 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
23a10 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
23a20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
23a30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23a40 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
23a50 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
23a60 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
23a70 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
23a80 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
23a90 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
23aa0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
23ab0 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
23ac0 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
23ad0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
23ae0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
23af0 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
23b00 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
23b10 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
23b20 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
23b30 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
23b40 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23b50 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
23b60 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
23b70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
23b80 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
23b90 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
23ba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23bc0 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
23bd0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
23be0 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
23bf0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
23c00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23c10 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23c30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
23c40 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
23c50 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
23c60 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
23c70 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
23c80 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
23c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
23ca0 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
23cb0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
23cc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
23cd0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
23ce0 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
23cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
23d00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
23d10 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
23d20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23d30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
23d40 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
23d50 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
23d60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
23d70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
23d80 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
23d90 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
23da0 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
23db0 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
23dc0 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
23dd0 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
23de0 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
23df0 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
23e00 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
23e10 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
23e20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
23e30 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
23e40 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
23e50 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
23e60 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
23e70 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
23e80 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
23e90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
23ea0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
23eb0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
23ec0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
23ed0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
23ee0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23ef0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
23f00 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
23f10 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
23f20 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
23f30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23f40 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
23f50 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
23f60 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
23f70 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
23f80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23f90 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
23fa0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
23fb0 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
23fc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
23fd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23fe0 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
23ff0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
24000 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
24010 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
24020 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
24030 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
24040 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
24050 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
24060 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
24070 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
24080 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
24090 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
240a0 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
240b0 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
240c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
240d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
240e0 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
240f0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
24100 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
24110 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
24120 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
24130 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
24140 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
24150 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
24160 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
24170 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
24180 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
24190 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
241a0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
241b0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
241c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
241d0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
241e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
241f0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
24200 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
24210 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
24220 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
24230 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
24240 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
24250 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
24260 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
24270 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
24280 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
24290 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
242a0 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
242b0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
242c0 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
242d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
242e0 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
242f0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
24300 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
24310 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
24320 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
24330 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
24340 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
24350 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
24360 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
24370 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
24380 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
24390 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
243a0 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
243b0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
243c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
243d0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
243e0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
243f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
24400 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
24410 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
24420 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
24430 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
24440 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
24450 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
24460 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
24470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24480 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
24490 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
244a0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
244b0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
244c0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
244d0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
244e0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
244f0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
24500 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
24510 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
24520 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
24530 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
24540 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
24550 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
24560 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
24570 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
24580 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
24590 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
245a0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
245b0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
245c0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
245d0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
245e0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
245f0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
24600 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
24610 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
24620 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
24630 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
24640 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
24650 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
24660 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
24670 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
24680 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
24690 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
246a0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
246b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
246c0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
246d0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
246e0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
246f0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
24700 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
24710 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24720 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
24730 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
24740 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
24750 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
24760 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
24770 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
24780 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
24790 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
247a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
247b0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
247c0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
247d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
247e0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
247f0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
24800 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
24810 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
24820 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
24830 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
24840 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
24850 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
24860 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24870 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
24880 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
24890 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
248a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
248b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
248c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
248d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
248e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
248f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
24900 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
24910 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
24920 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24930 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
24940 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
24950 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
24960 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
24970 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
24980 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
24990 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
249a0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
249b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
249c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
249d0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
249e0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
249f0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
24a00 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
24a10 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
24a20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
24a30 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
24a40 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
24a50 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
24a60 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
24a70 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
24a80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
24a90 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
24aa0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
24ab0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
24ac0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
24ad0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
24ae0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
24af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24b00 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
24b10 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70  reePtrmapBegin(p
24b20 42 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  Bt, iStatement);
24b30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
24b40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
24b50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24b60 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
24b70 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
24b80 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
24b90 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
24ba0 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
24bb0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
24bc0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
24bd0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
24be0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
24bf0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
24c00 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
24c10 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
24c20 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
24c30 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
24c40 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
24c50 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
24c60 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
24c70 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
24c80 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
24c90 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
24ca0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
24cb0 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
24cc0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
24cd0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
24ce0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
24cf0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
24d00 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
24d10 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
24d20 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
24d30 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
24d40 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
24d50 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
24d60 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
24d70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
24d80 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
24d90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
24da0 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
24db0 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
24dc0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
24dd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24de0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
24df0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
24e00 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
24e10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e20 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
24e30 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
24e40 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
24e50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
24e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
24e70 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
24e80 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
24e90 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
24ea0 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
24eb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24ec0 74 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65  ter(p);.    btre
24ed0 65 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20  ePtrmapEnd(pBt, 
24ee0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
24ef0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24f00 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
24f10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
24f20 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
24f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
24f50 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
24f60 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
24f70 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
24f80 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
24f90 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
24fa0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
24fb0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
24fc0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
24fd0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
24fe0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
24ff0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
25000 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
25010 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
25020 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
25030 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
25040 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
25050 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
25060 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
25070 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
25080 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
25090 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
250a0 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
250b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
250c0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
250d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
250e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
250f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25100 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
25110 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
25120 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
25130 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
25140 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
25150 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
25160 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
25170 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
25180 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
25190 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
251a0 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
251b0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
251c0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
251d0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
251e0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
251f0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
25200 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
25210 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
25220 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
25230 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
25240 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
25250 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f  TREE_WRCSR bit o
25260 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61  f wrFlag is clea
25270 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
25280 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62  or can only.** b
25290 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
252a0 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45  ng.  If the BTRE
252b0 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73  E_WRCSR bit is s
252c0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
252d0 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  sor.** can be us
252e0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
252f0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66  r for writing if
25300 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
25310 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  s for writing.**
25320 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
25330 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f  These are the co
25340 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
25350 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
25360 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e  er.** for writin
25370 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a  g to be allowed:
25380 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
25390 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
253a0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
253b0 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69   wrFlag containi
253c0 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  ng BTREE_WRCSR.*
253d0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
253e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
253f0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
25400 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
25410 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
25420 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
25430 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
25440 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
25450 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
25460 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
25470 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
25480 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
25490 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
254a0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
254b0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
254c0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
254d0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
254e0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
254f0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
25500 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
25510 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
25520 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
25530 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
25540 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
25550 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
25560 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
25570 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
25580 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  on..**.** The BT
25590 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69  REE_FORDELETE bi
255a0 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20  t of wrFlag may 
255b0 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65  optionally be se
255c0 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52  t if BTREE_WRCSR
255d0 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20  .** is set.  If 
255e0 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74  FORDELETE is set
255f0 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
25600 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
25610 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74  tation that.** t
25620 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  his cursor will 
25630 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20  only be used to 
25640 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65  seek to and dele
25650 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e  te entries of an
25660 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72   index.** as par
25670 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45  t of a larger DE
25680 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
25690 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68   The FORDELETE h
256a0 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  int is not used 
256b0 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65  by.** this imple
256c0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
256d0 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61  in a hypothetica
256e0 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74  l alternative st
256f0 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a  orage engine .**
25700 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   in which index 
25710 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f  entries are auto
25720 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
25730 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e  d when correspon
25740 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  ding table.** ro
25750 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ws are deleted, 
25760 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c  the FORDELETE fl
25770 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61  ag is a hint tha
25780 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44  t all SEEK and D
25790 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69  ELETE.** operati
257a0 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73  ons on this curs
257b0 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73  or can be no-ops
257c0 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70   and all READ op
257d0 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a  erations can .**
257e0 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72   return a null r
257f0 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30  ow (2-bytes: 0x0
25800 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e  1 0x00)..**.** N
25810 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
25820 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
25830 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
25840 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
25850 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
25860 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
25870 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
25880 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
25890 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
258a0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
258b0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
258c0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
258d0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
258e0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
258f0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
25900 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
25910 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
25920 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
25930 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
25940 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
25950 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
25960 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
25990 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
259c0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
259d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
259e0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a00 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
25a10 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
25a20 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
25a30 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
25a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25a50 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
25a60 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
25a70 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
25a80 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
25a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
25aa0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
25ab0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
25ac0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
25ad0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25ae0 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
25af0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
25b00 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
25b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
25b30 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
25b40 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
25b50 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
25b60 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
25b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
25b80 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
25b90 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
25ba0 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
25bb0 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
25bc0 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
25bd0 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
25be0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
25bf0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
25c00 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
25c10 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
25c20 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
25c30 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
25c40 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
25c50 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
25c60 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
25c70 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
25c80 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
25c90 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
25ca0 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
25cb0 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
25cc0 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
25cd0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
25ce0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
25cf0 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
25d00 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
25d10 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
25d20 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
25d30 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
25d40 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
25d50 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
25d60 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
25d70 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
25d80 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
25d90 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
25da0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
25db0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
25dc0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
25dd0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
25de0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
25df0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
25e00 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
25e10 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
25e20 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
25e30 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
25e40 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
25e50 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
25e60 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
25e70 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
25e80 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
25e90 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
25ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
25eb0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
25ec0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
25ed0 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
25ee0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
25ef0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
25f00 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
25f10 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
25f20 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
25f30 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
25f40 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
25f50 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
25f60 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
25f70 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
25f80 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
25f90 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
25fa0 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
25fb0 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
25fc0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
25fd0 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
25fe0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
25ff0 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
26000 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
26010 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
26020 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
26030 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65  lag ? BTCF_Write
26040 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72  Flag : 0;.  pCur
26050 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
26060 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
26070 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26080 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
26090 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
260a0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
260b0 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
260c0 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
260d0 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
260e0 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
260f0 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
26100 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
26110 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
26120 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
26130 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
26140 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
26150 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
26160 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
26170 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
26180 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
26190 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
261a0 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
261b0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
261c0 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
261d0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
261e0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
261f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
26200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26210 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
26220 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
26230 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26260 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
26270 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
262a0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
262b0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
262c0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
262f0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
26300 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
26310 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26330 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
26340 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
26350 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
26360 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26380 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
26390 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
263a0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
263b0 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
263c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
263d0 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
263e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
263f0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
26400 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
26410 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
26420 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
26430 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
26440 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
26450 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26460 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
26470 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
26480 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
26490 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
264a0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
264b0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
264c0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
264d0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
264e0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
264f0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
26500 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
26510 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
26520 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
26530 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
26540 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
26550 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
26560 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
26570 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
26580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
26590 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
265a0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
265b0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
265c0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
265d0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
265e0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
265f0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
26600 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
26610 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
26620 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
26630 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
26640 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
26650 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
26660 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
26670 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
26680 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
26690 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
266a0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
266b0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
266c0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
266d0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
266e0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
266f0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
26700 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
26710 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
26720 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
26730 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
26740 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
26750 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
26760 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
26770 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
26780 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
26790 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
267a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
267b0 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
267c0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
267d0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
267e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
267f0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
26800 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
26810 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
26820 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
26830 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
26840 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
26850 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
26860 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
26870 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
26880 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
26890 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
268a0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
268b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
268c0 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
268d0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
268e0 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
268f0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
26900 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
26910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26920 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
26930 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
26940 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
26950 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
26960 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
26970 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
26980 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
26990 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
269a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
269b0 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
269c0 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
269d0 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
269e0 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
269f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
26a00 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
26a10 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
26a20 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
26a30 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
26a40 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
26a50 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
26a60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
26a70 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
26a80 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
26a90 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
26aa0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
26ab0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
26ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26ad0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
26ae0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
26af0 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
26b00 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
26b10 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
26b20 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
26b30 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
26b40 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
26b50 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
26b60 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
26b70 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
26b80 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
26b90 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
26ba0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
26bb0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
26bc0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
26bd0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
26be0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
26bf0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
26c00 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
26c10 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
26c20 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
26c30 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
26c40 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
26c50 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
26c60 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
26c70 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
26c80 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
26c90 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
26ca0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
26cb0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
26cc0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
26cd0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
26ce0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
26cf0 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
26d00 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
26d10 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
26d20 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
26d30 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
26d40 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
26d50 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
26d60 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
26d70 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
26d80 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
26d90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26da0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
26db0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
26dc0 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75  ge;.    pCur->cu
26dd0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
26de0 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
26df0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
26e00 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
26e10 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
26e20 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
26e30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
26e40 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
26e50 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
26e60 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
26e70 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
26e80 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
26e90 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
26ea0 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
26eb0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
26ec0 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
26ed0 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
26ee0 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
26ef0 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
26f00 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
26f10 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
26f20 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
26f30 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
26f40 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
26f50 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
26f60 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
26f70 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
26f80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
26f90 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
26fa0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
26fb0 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
26fc0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26fd0 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
26fe0 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
26ff0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
27000 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
27010 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72  nteger key or "r
27020 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c  owid" for a tabl
27030 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73  e btree..** This
27040 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
27050 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72   valid for a cur
27060 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
27070 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f  ting into a.** o
27080 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74  rdinary table bt
27090 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ree.  If the cur
270a0 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  sor points to an
270b0 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a   index btree or.
270c0 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74  ** is invalid, t
270d0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69  he result of thi
270e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64  s routine is und
270f0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73  efined..*/.i64 s
27100 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
27110 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  erKey(BtCursor *
27120 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
27130 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27140 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27150 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27160 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27180 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
27190 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
271a0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
271b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d  ur->info.nKey;.}
271c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
271d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
271e0 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f  es of payload fo
271f0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
27200 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72   pCur is.** curr
27210 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
27220 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74  o.  For table bt
27230 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
27240 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  be the amount.**
27250 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69   of data.  For i
27260 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69  ndex btrees, thi
27270 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69  s will be the si
27280 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a  ze of the key..*
27290 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
272a0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
272b0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
272c0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
272d0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
272e0 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
272f0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
27300 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
27310 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
27320 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
27330 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
27340 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27350 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  D..*/.u32 sqlite
27360 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
27370 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
27380 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
27390 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
273a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
273b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
273c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
273d0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
273e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
273f0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
27400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
27410 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
27420 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
27430 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
27440 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
27450 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
27460 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
27470 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
27480 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
27490 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
274a0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
274b0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
274c0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
274d0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
274e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
274f0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
27500 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
27510 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
27520 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
27530 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27540 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
27550 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27560 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
27570 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
27580 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
27590 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
275a0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
275b0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
275c0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
275d0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
275e0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
275f0 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
27600 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
27610 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
27620 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
27630 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
27640 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
27650 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
27660 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
27670 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
27680 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
27690 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
276a0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
276b0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
276c0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
276d0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
276e0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
276f0 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
27700 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
27710 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
27720 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
27730 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
27740 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
27750 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
27760 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
27770 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
27780 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
27790 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
277a0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
277b0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
277c0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
277d0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
277e0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
277f0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
27800 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
27810 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
27820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
27830 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
27840 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
27850 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
27860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27870 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
27880 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
27890 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
278a0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
278b0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
278c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
278d0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
278e0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
278f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
27900 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
27910 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
27920 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27930 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
27940 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
27950 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
27960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27970 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
27980 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
27990 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
279a0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
279b0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
279c0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
279d0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
279e0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
279f0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
27a00 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
27a10 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
27a20 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
27a30 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
27a40 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
27a50 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
27a60 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
27a70 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
27a80 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
27a90 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
27aa0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
27ab0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
27ac0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
27ad0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
27ae0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
27af0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
27b00 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
27b10 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
27b20 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
27b30 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
27b40 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
27b50 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
27b60 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
27b70 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
27b80 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
27b90 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
27ba0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
27bb0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
27bc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27bd0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
27be0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
27bf0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
27c00 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
27c10 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
27c20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
27c30 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
27c40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
27c50 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
27c60 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
27c70 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
27c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27c90 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27ca0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
27cb0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
27cc0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
27cd0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
27ce0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
27cf0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
27d00 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
27d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27d20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
27d30 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
27d40 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
27d50 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
27d60 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
27d70 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
27d80 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
27d90 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
27da0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
27db0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
27dc0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
27dd0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
27de0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
27df0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
27e00 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
27e10 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
27e20 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
27e30 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
27e40 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
27e50 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
27e60 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
27e70 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
27e80 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
27e90 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
27ea0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
27eb0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
27ec0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
27ed0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
27ee0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
27ef0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
27f00 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
27f10 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
27f20 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
27f30 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
27f40 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
27f50 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
27f60 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
27f70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27f80 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
27f90 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
27fa0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
27fb0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
27fc0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
27fd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
27fe0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
27ff0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
28000 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
28010 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
28020 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
28030 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
28040 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28050 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
28060 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28080 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
28090 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
280a0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
280b0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
280c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
280d0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
280e0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
280f0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
28100 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
28110 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
28120 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
28130 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
28140 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28150 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
28160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
28180 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28190 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
281a0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
281b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
281c0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
281d0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
281e0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
281f0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
28200 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
28210 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
28220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
28240 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
28250 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
28260 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
28270 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
28280 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
28290 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
282a0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
282b0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
282c0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
282d0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
282e0 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
282f0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
28300 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
28310 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
28320 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
28330 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
28340 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
28350 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
28360 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
28370 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
28380 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
28390 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
283a0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
283b0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
283c0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
283d0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
283e0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
283f0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
28400 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
28410 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
28420 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
28430 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
28440 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
28450 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
28460 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
28470 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
28480 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
28490 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
284a0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
284b0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
284c0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
284d0 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
284e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
284f0 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
28500 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
28510 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
28520 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
28530 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
28540 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
28550 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
28560 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
28570 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
28580 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
28590 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
285a0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
285b0 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
285c0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
285d0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
285e0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
285f0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
28600 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
28610 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
28620 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
28630 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
28640 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
28650 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
28660 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
28670 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
28680 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
28690 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
286a0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
286b0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
286c0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
286d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
286e0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
286f0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
28700 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
28710 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
28720 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
28730 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
28740 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
28750 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
28760 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
28770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
28780 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
28790 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
287a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
287b0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
287c0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
287d0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
287e0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
287f0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
28800 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
28810 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
28820 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
28830 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
28840 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
28850 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
28860 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
28870 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
28880 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
28890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
288a0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
288b0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
288c0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
288d0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
288e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
288f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
28900 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
28910 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28920 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28930 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
28940 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
28950 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
28960 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
28970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28980 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
28990 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
289a0 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
289b0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
289c0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
289d0 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
289e0 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
289f0 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a20 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
28a30 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
28a40 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
28a50 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
28a60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28a70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28a80 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28a90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28aa0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
28ab0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
28ac0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28ad0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28ae0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
28af0 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
28b00 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
28b10 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
28b20 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
28b30 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
28b40 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
28b50 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
28b60 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
28b70 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
28b80 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
28b90 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
28ba0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
28bb0 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
28bc0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
28bd0 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
28be0 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73  ayload );..  ass
28bf0 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20  ert( aPayload > 
28c00 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
28c10 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61    if( (uptr)(aPa
28c20 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61  yload - pPage->a
28c30 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73  Data) > (pBt->us
28c40 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d  ableSize - pCur-
28c50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b  >info.nLocal) ){
28c60 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
28c70 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
28c80 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
28c90 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
28ca0 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a  rror.  The.    *
28cb0 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  * conditional ab
28cc0 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20  ove is really:. 
28cd0 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f     **    &aPaylo
28ce0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
28cf0 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
28d00 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
28d10 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75  eSize].    ** bu
28d20 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f  t is recast into
28d30 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72   its current for
28d40 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67  m to avoid integ
28d50 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62  er overflow prob
28d60 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lems.    */.    
28d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
28d80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
28d90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
28da0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
28db0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
28dc0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
28dd0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
28de0 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
28df0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
28e00 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
28e10 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
28e20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28e30 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
28e40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
28e50 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
28e60 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
28e70 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
28e80 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
28e90 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
28ea0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
28eb0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
28ec0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
28ed0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
28ee0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
28ef0 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
28f00 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
28f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28f20 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
28f30 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
28f40 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
28f50 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
28f60 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
28f70 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
28f80 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
28f90 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
28fa0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
28fb0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
28fc0 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
28fd0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
28fe0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
28ff0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
29000 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
29010 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63   now..    ** Exc
29020 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ept, do not allo
29030 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d  cate aOverflow[]
29040 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20   for eOp==2..   
29050 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
29060 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
29070 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
29080 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
29090 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
290a0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
290b0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
290c0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
290d0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
290e0 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
290f0 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
29100 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
29110 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
29120 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
29130 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
29140 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
29150 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
29160 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
29170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29180 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72   eOp!=2 && (pCur
29190 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
291a0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
291b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
291c0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
291d0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
291e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
291f0 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
29200 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
29210 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
29220 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
29230 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
29240 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
29250 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
29260 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
29270 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
29280 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
29290 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
292a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
292b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
292c0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
292d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
292e0 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f   pCur->nOvflAllo
292f0 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20  c = nOvfl*2;.   
29300 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
29310 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20  erflow = aNew;. 
29320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29330 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
29340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29350 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d      memset(pCur-
29360 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e  >aOverflow, 0, n
29370 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  Ovfl*sizeof(Pgno
29380 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  ));.        pCur
29390 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
293a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
293b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
293c0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
293d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
293e0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
293f0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
29400 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
29410 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
29420 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
29430 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
29440 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
29450 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
29460 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
29470 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
29480 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20  idOvfl)!=0.     
29490 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
294a0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
294b0 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze].    ){.     
294c0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
294d0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
294e0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
294f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
29500 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
29510 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
29520 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ze);.    }..    
29530 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
29540 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
29550 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
29560 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  +){..      /* If
29570 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
29580 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
29590 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
295a0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
295b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
295c0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
295d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
295e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76  ssert( pCur->aOv
295f0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a  erflow[iIdx]==0.
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
29620 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
29630 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
29640 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
29650 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   );.        pCur
29660 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
29670 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
29680 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
29690 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
296a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
296b0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
296c0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
296d0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
296e0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
296f0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
29700 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
29710 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
29720 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
29730 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
29740 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
29750 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
29760 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
29770 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
29780 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
29790 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
297a0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
297b0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
297c0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
297d0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
297e0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
297f0 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  t the aOverflow[
29800 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20  ] array must be 
29810 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73  allocated becaus
29820 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20  e eOp!=2.       
29830 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f   ** here.  If eO
29840 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65  p==2, then offse
29850 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72  t==0 and this br
29860 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61  anch is never ta
29870 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ken..        */.
29880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29890 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20  eOp!=2 );.      
298a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
298b0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
298c0 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
298d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
298e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
298f0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
29900 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
29910 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
29920 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
29930 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
29940 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
29950 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29960 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
29970 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
29980 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
29990 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
299a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
299b0 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
299c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
299d0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
299e0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
299f0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
29a00 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
29a10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
29a20 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
29a30 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
29a40 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
29a50 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
29a60 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
29a70 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
29a80 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
29a90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
29aa0 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
29ab0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
29ac0 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
29ad0 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
29ae0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
29af0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
29b00 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
29b10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29b20 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
29b30 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
29b40 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
29b50 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
29b60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29b70 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
29b80 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
29b90 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
29ba0 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
29bb0 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
29bc0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
29bd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
29be0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
29bf0 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
29c00 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
29c10 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
29c20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
29c30 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
29c40 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
29c50 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
29c60 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
29c70 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
29c80 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
29c90 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
29ca0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
29cb0 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
29cc0 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34     7) at least 4
29cd0 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
29ce0 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
29cf0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
29d00 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
29d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
29d20 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
29d30 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
29d40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29d50 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
29d60 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
29d70 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
29d80 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
29d90 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
29da0 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
29db0 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
29dc0 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
29dd0 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
29de0 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
29df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
29e00 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
29e40 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
29e50 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
29e80 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
29e90 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
29ea0 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
29ed0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
29ee0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
29ef0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f10 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
29f20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
29f30 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
29f40 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
29f50 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
29f60 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
29f70 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
29f80 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
29fb0 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
29fc0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20           /* (7) 
29ff0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
2a000 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
2a010 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
2a020 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
2a030 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
2a040 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
2a050 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28        /* hence (
2a080 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  7) */.          
2a090 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
2a0a0 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
2a0b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a0c0 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
2a0d0 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
2a0e0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
2a0f0 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
2a100 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
2a110 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
2a120 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2a130 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
2a140 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
2a150 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
2a160 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
2a170 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
2a180 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2a190 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2a1a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
2a1b0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
2a1d0 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50  eOp&0x01)==0 ? P
2a1e0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
2a1f0 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
2a200 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2a210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2a230 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
2a240 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2a250 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2a260 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
2a270 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
2a280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2a290 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
2a2a0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
2a2b0 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  +4], pBuf, a, (e
2a2c0 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67  Op&0x01), pDbPag
2a2d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a2e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a2f0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
2a300 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
2a310 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
2a320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a330 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
2a340 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
2a350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a360 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2a370 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
2a380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a390 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a3a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a3b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
2a3c0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
2a3d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a3e0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
2a3f0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
2a400 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
2a410 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
2a420 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
2a430 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
2a440 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
2a450 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
2a460 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
2a470 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
2a480 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a  o a valid row.**
2a490 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
2a4a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2a4b0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
2a4c0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
2a4d0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
2a4e0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
2a4f0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
2a500 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
2a510 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
2a520 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
2a530 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
2a540 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
2a550 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
2a560 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
2a570 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
2a580 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
2a590 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2a5a0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2a5b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2a5c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2a5d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a5e0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
2a5f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a600 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
2a610 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2a620 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
2a630 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a640 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
2a650 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
2a660 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
2a670 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
2a680 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
2a690 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
2a6a0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
2a6b0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
2a6c0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
2a6d0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
2a6e0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
2a6f0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
2a700 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
2a710 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
2a720 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
2a730 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2a740 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
2a750 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
2a760 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
2a770 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
2a780 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
2a790 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
2a7a0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
2a7b0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
2a7c0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
2a7d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
2a7e0 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
2a7f0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
2a800 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
2a810 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
2a820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a830 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
2a840 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
2a850 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2a860 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a870 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
2a880 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
2a890 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a8a0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a8b0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2a8c0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2a8d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a8e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2a8f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2a900 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2a910 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a920 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
2a930 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
2a940 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
2a950 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a960 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a970 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
2a980 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2a990 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
2a9a0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2a9b0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
2a9c0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
2a9d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a9e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2a9f0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
2aa00 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
2aa10 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
2aa20 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
2aa30 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2aa40 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
2aa50 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
2aa60 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
2aa70 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
2aa80 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
2aa90 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
2aaa0 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
2aab0 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
2aac0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
2aad0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
2aae0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
2aaf0 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
2ab00 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
2ab10 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
2ab20 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
2ab30 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
2ab40 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
2ab50 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
2ab60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2ab70 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2ab80 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
2ab90 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
2aba0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
2abb0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
2abc0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
2abd0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
2abe0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
2abf0 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
2ac00 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
2ac10 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
2ac20 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
2ac30 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
2ac40 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
2ac50 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
2ac60 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
2ac70 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
2ac80 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
2ac90 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
2aca0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
2acb0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
2acc0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
2acd0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
2ace0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
2acf0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
2ad00 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
2ad10 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
2ad20 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
2ad30 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
2ad40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2ad50 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
2ad60 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
2ad70 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
2ad80 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
2ad90 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
2ada0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2adb0 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
2adc0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
2add0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
2ade0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
2adf0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
2ae00 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
2ae10 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
2ae20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
2ae30 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
2ae40 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
2ae50 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
2ae60 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
2ae70 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
2ae80 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
2ae90 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
2aea0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2aeb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2aec0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2aed0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2aee0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2aef0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2af00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2af10 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2af20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2af30 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2af40 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
2af50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2af60 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
2af70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2af80 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
2af90 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2afa0 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
2afb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2afc0 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
2afd0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
2afe0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2aff0 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
2b000 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b010 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
2b020 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
2b030 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
2b040 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b050 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
2b060 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
2b070 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
2b080 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
2b090 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
2b0a0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
2b0b0 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
2b0c0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
2b0d0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2b0e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
2b0f0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
2b100 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
2b110 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
2b120 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
2b130 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
2b140 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
2b150 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
2b160 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
2b170 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
2b180 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
2b190 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
2b1a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
2b1b0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
2b1c0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
2b1d0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
2b1e0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
2b1f0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
2b200 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
2b210 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
2b220 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
2b230 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
2b240 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
2b250 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
2b260 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
2b270 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
2b280 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
2b290 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
2b2a0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
2b2b0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
2b2c0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
2b2d0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
2b2e0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
2b2f0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
2b300 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
2b310 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
2b320 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
2b330 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
2b340 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74  ePayloadFetch(Bt
2b350 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2b360 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
2b370 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
2b380 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
2b390 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2b3a0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
2b3b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
2b3c0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
2b3d0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
2b3e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2b3f0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
2b400 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
2b410 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
2b420 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
2b430 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
2b440 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
2b450 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
2b460 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
2b470 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
2b480 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
2b490 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
2b4a0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
2b4b0 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
2b4c0 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
2b4d0 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
2b4e0 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
2b4f0 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
2b500 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
2b510 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
2b520 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
2b530 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b540 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
2b550 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b560 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b580 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b590 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2b5a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2b5b0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
2b5c0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
2b5d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2b5e0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2b5f0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
2b600 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
2b610 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b620 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b630 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66  .  }.  pCur->inf
2b640 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2b650 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2b660 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2b670 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2b680 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
2b690 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ++;.  pCur->aiId
2b6a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2b6b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74   0;.  return get
2b6c0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2b6d0 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d   newPgno, &pCur-
2b6e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b6f0 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  age],.          
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2b710 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ur, pCur->curPag
2b720 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66  erFlags);.}..#if
2b730 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2b740 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
2b750 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
2b760 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
2b770 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
2b780 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
2b790 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
2b7a0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
2b7b0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
2b7c0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
2b7d0 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
2b7e0 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
2b7f0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
2b800 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
2b810 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2b820 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
2b830 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
2b840 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
2b850 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
2b860 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2b870 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
2b880 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2b890 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
2b8a0 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
2b8b0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
2b8c0 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
2b8d0 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
2b8e0 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
2b8f0 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b910 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
2b920 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
2b930 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
2b940 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
2b950 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
2b960 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2b970 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2b980 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2b990 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2b9a0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
2b9b0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
2b9c0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2b9d0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
2b9e0 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
2b9f0 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
2ba00 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
2ba10 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
2ba20 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
2ba30 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2ba40 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
2ba50 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
2ba60 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
2ba70 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
2ba80 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
2ba90 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
2baa0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
2bab0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2bac0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
2bad0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
2bae0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2baf0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
2bb00 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
2bb10 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
2bb20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
2bb30 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
2bb40 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
2bb50 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
2bb60 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
2bb70 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2bb80 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2bb90 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2bba0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2bbb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bbc0 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
2bbd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2bbe0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bbf0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
2bc00 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
2bc10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bc20 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
2bc30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2bc40 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2bc50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2bc60 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
2bc70 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
2bc80 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2bc90 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
2bca0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2bcb0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
2bcc0 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
2bcd0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2bce0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2bcf0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2bd00 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2bd10 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2bd20 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
2bd30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bd40 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  --]);.}../*.** M
2bd50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2bd60 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
2bd70 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
2bd80 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2bd90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
2bda0 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
2bdb0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
2bdc0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2bdd0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
2bde0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
2bdf0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
2be00 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
2be10 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
2be20 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
2be30 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
2be40 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
2be50 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
2be60 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
2be70 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
2be80 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
2be90 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
2bea0 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
2beb0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
2bec0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
2bed0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
2bee0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
2bef0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2bf00 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
2bf10 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
2bf20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
2bf30 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
2bf40 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
2bf50 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
2bf60 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
2bf70 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
2bf80 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2bf90 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
2bfa0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
2bfb0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
2bfc0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
2bfd0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
2bfe0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
2bff0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
2c000 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
2c010 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
2c020 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
2c030 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
2c040 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
2c050 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
2c060 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
2c070 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
2c080 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
2c090 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2c0a0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
2c0b0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
2c0c0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
2c0d0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
2c0e0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
2c0f0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
2c100 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
2c110 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
2c120 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2c130 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2c140 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
2c150 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
2c160 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
2c170 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2c180 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
2c190 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2c1a0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
2c1b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2c1c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2c1d0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2c1e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2c1f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
2c200 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2c210 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2c220 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
2c230 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2c240 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2c250 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
2c260 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2c270 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
2c280 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2c290 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
2c2a0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
2c2b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
2c2c0 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
2c2d0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2c2e0 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
2c2f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
2c300 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
2c310 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c320 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
2c330 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
2c340 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
2c350 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
2c360 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
2c370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2c380 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c390 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20  iPage]!=0 );.   
2c3a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2c3b0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
2c3c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
2c3d0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
2c3e0 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
2c3f0 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
2c400 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2c410 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2c420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c430 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2c440 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c450 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
2c460 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2c470 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
2c480 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
2c490 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
2c4a0 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
2c4d0 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
2c4e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c4f0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2c500 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2c510 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2c520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2c530 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
2c540 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
2c550 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
2c560 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2c570 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
2c580 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2c590 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
2c5a0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
2c5b0 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
2c5c0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
2c5d0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
2c5e0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
2c5f0 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
2c600 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
2c610 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
2c620 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
2c630 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
2c640 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
2c650 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
2c660 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
2c670 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
2c680 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2c690 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
2c6a0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
2c6b0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
2c6c0 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
2c6d0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2c6e0 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
2c6f0 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
2c700 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
2c710 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
2c720 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
2c730 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2c740 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2c750 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
2c760 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
2c770 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
2c780 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
2c790 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
2c7a0 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
2c7b0 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
2c7c0 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
2c7d0 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
2c7e0 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
2c7f0 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
2c800 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2c810 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
2c820 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
2c830 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
2c840 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
2c850 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
2c860 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
2c870 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
2c880 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c890 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43  _BKPT;.  }..  pC
2c8a0 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
2c8b0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2c8c0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2c8d0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2c8e0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2c8f0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2c900 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69  ValidOvfl);..  i
2c910 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
2c920 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
2c930 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2c940 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
2c950 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
2c960 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
2c970 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
2c980 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
2c990 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2c9a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
2c9b0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
2c9c0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
2c9d0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
2c9e0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
2c9f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2ca00 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
2ca10 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2ca20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
2ca30 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
2ca40 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2ca50 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ALID;.  }.  retu
2ca60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ca70 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2ca80 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2ca90 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2caa0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2cab0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2cac0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2cad0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2cae0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2caf0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2cb00 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2cb10 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2cb20 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2cb30 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2cb40 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2cb50 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2cb60 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2cb70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2cb80 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2cb90 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2cba0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2cbb0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2cbc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cbd0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2cbe0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2cbf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2cc00 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2cc10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2cc20 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
2cc30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cc40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2cc50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
2cc60 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
2cc70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2cc80 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
2cc90 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2cca0 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
2ccb0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2ccc0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2ccd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2cce0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2ccf0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
2cd00 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
2cd10 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2cd20 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
2cd30 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2cd40 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
2cd50 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
2cd60 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
2cd70 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
2cd80 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2cd90 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
2cda0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2cdb0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
2cdc0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2cdd0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
2cde0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2cdf0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
2ce00 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
2ce10 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
2ce20 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
2ce30 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
2ce40 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2ce50 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
2ce60 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
2ce70 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2ce80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2ce90 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
2cea0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2ceb0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2cec0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ced0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2cee0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
2cef0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2cf00 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2cf10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2cf20 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2cf30 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2cf40 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
2cf50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2cf60 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
2cf70 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
2cf80 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2cf90 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2cfa0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
2cfb0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2cfc0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
2cfd0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
2cfe0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2cff0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
2d000 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d010 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2d020 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2d030 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2d040 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d050 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2d060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2d070 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2d080 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
2d090 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2d0a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
2d0b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2d0c0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2d0d0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2d0e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2d0f0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2d100 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2d110 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2d120 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2d130 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2d140 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2d150 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2d160 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2d170 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
2d180 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2d190 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2d1a0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2d1b0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d1c0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d1d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d1e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2d1f0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2d200 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
2d210 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2d220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d230 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
2d240 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2d250 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2d260 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2d270 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2d280 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2d290 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2d2a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2d2b0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
2d2c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2d2d0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2d2e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2d2f0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
2d300 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2d310 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
2d320 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2d330 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2d340 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2d350 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
2d360 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2d370 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2d380 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2d390 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2d3a0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2d3b0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2d3c0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2d3d0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2d3e0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2d3f0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2d400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2d410 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
2d420 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2d430 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
2d440 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d450 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2d460 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d470 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2d480 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2d490 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2d4a0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2d4b0 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
2d4c0 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
2d4d0 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
2d4e0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
2d4f0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2d500 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
2d510 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2d520 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
2d530 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2d540 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
2d550 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
2d560 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
2d570 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
2d580 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
2d590 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
2d5a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
2d5b0 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
2d5c0 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
2d5d0 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
2d5e0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2d5f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2d600 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
2d610 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
2d620 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
2d630 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2d640 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2d650 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d660 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2d670 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
2d680 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2d690 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
2d6a0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
2d6b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d6c0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
2d6d0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2d6e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d6f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
2d700 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2d710 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2d720 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2d730 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2d740 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2d750 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2d760 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2d770 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
2d780 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2d790 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2d7a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2d7b0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2d7c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
2d7d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2d7e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2d7f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d800 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2d810 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2d820 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
2d830 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
2d840 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2d850 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
2d860 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
2d870 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d880 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2d890 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
2d8a0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
2d8b0 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
2d8c0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
2d8d0 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
2d8e0 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
2d8f0 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
2d900 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
2d910 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
2d920 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
2d930 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
2d940 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
2d950 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
2d960 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
2d970 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
2d980 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
2d990 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
2d9a0 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
2d9b0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2d9c0 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
2d9d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2d9e0 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2d9f0 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
2da00 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
2da10 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
2da20 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
2da30 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
2da40 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
2da50 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
2da60 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
2da70 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
2da80 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
2da90 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
2daa0 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
2dab0 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
2dac0 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
2dad0 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
2dae0 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
2daf0 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
2db00 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
2db10 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
2db20 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2db30 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
2db40 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2db50 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2db60 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2db70 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2db80 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
2db90 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2dba0 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
2dbb0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
2dbc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2dbd0 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
2dbe0 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
2dbf0 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
2dc00 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
2dc10 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
2dc20 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2dc30 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2dc40 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2dc60 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
2dc70 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2dc80 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
2dc90 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2dca0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2dcb0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2dcc0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2dcd0 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
2dce0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2dcf0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  xKey..**.** For 
2dd00 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68  index tables, th
2dd10 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65  e pIdxKey->eqSee
2dd20 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74  n field is set t
2dd30 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  o 1 if there.** 
2dd40 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20  exists an entry 
2dd50 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
2dd60 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  t exactly matche
2dd70 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a  s pIdxKey.  .*/.
2dd80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2dd90 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
2dda0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2ddb0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2ddc0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
2ddd0 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
2dde0 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
2ddf0 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
2de00 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
2de10 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
2de20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2de30 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
2de40 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
2de50 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
2de60 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
2de70 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
2de80 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dea0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
2deb0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
2dec0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
2ded0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
2dee0 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
2def0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2df00 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2df10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2df20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2df30 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2df40 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
2df50 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
2df60 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
2df70 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
2df80 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20  eyInfo==0) );.  
2df90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2dfa0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2dfb0 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d  ID || (pIdxKey==
2dfc0 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e  0)==(pCur->curIn
2dfd0 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f  tKey!=0) );..  /
2dfe0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2dff0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
2e000 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
2e010 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
2e020 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
2e030 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2e040 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2e050 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
2e060 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20  f( pIdxKey==0.  
2e070 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
2e080 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
2e090 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2e0a0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2e0b0 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  ey)!=0.  ){.    
2e0c0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2e0d0 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2e0e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2e0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2e110 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2e120 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2e130 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d  ast)!=0 && pCur-
2e140 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
2e150 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2e160 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
2e170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e180 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2e190 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78  pIdxKey ){.    x
2e1a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2e1b0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
2e1c0 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b  ompare(pIdxKey);
2e1d0 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72  .    pIdxKey->er
2e1e0 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61  rCode = 0;.    a
2e1f0 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e  ssert( pIdxKey->
2e200 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20  default_rc==1 . 
2e210 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2e220 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2e230 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  0 .         || p
2e240 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2e250 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20  rc==-1.    );.  
2e260 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f  }else{.    xReco
2e270 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f  rdCompare = 0; /
2e280 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69  * All keys are i
2e290 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a  ntegers */.  }..
2e2a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2e2b0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2e2c0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2e2d0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2e2e0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2e2f0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2e300 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2e320 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2e330 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2e340 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
2e350 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
2e360 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e370 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
2e380 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2e390 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2e3a0 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
2e3b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2e3c0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2e3d0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2e3e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e3f0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2e400 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e410 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
2e420 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
2e430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2e440 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e450 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2e460 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y==pCur->curIntK
2e470 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2e480 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2e490 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
2e4a0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
2e4b0 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
2e4c0 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
2e4d0 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
2e4e0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2e4f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e500 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
2e510 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2e520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2e530 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2e540 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2e550 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2e560 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2e570 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2e580 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2e590 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2e5a0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2e5b0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2e5c0 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2e5d0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2e5e0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2e5f0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2e600 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2e610 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2e620 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2e630 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2e640 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2e650 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2e660 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2e670 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2e680 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2e690 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2e6a0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2e6b0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2e6c0 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2e6d0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2e6e0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2e6f0 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2e700 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2e710 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2e720 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2e730 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2e740 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2e750 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2e760 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2e770 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2e780 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2e790 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2e7a0 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2e7b0 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2e7c0 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2e7d0 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2e7e0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2e7f0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2e800 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2e810 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2e820 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2e830 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2e840 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2e850 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2e860 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2e870 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2e880 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2e890 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2e8a0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2e8b0 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2e8c0 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e8e0 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2e8f0 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ataEnd ) return 
2e900 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e910 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
2e920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e930 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
2e940 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
2e950 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2e960 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
2e970 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
2e980 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2e990 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2e9a0 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
2e9b0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2e9c0 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
2e9d0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2e9e0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2e9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ea00 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
2ea10 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2ea20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ea30 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2ea40 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
2ea50 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2ea60 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2ea70 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
2ea80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
2ea90 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
2eaa0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
2eab0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2eac0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2ead0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2eae0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
2eb00 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
2eb10 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
2eb20 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
2eb30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2eb40 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2eb50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2eb60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2eb70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2eb80 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2eb90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2eba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2ebb0 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2ebc0 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2ebd0 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2ebe0 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2ebf0 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
2ec00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ec10 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2ec20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f     int nCell;  /
2ec30 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43  * Size of the pC
2ec40 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65  ell cell in byte
2ec50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65  s */.        pCe
2ec60 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2ec70 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2ec80 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
2ec90 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
2eca0 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
2ecb0 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
2ecc0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
2ecd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
2ece0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
2ecf0 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
2ed00 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
2ed10 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
2ed20 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
2ed30 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
2ed40 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
2ed50 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
2ed60 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
2ed70 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
2ed80 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
2ed90 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
2eda0 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
2edb0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2edc0 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
2edd0 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
2ede0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
2edf0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2ee00 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
2ee10 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
2ee20 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
2ee30 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
2ee40 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
2ee50 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
2ee60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43     */.        nC
2ee70 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
2ee80 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2ee90 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
2eea0 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  tePayload ){.   
2eeb0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2eec0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
2eed0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2eee0 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
2eef0 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
2ef00 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
2ef10 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2ef20 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
2ef30 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
2ef40 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
2ef50 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2ef60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ef70 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70  pCell+nCell+1==p
2ef80 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2ef90 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2efa0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2efb0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2efc0 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
2efd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2efe0 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
2eff0 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
2f000 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
2f010 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
2f020 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
2f030 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
2f040 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f050 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
2f060 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
2f070 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
2f080 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
2f090 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
2f0a0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2f0b0 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
2f0c0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2f0d0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2f0e0 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
2f0f0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2f100 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2f110 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2f120 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
2f130 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2f140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f150 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2f160 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
2f170 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
2f180 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
2f190 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
2f1a0 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
2f1b0 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
2f1c0 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
2f1d0 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
2f1e0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2f1f0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2f200 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
2f210 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
2f220 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
2f230 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
2f240 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
2f250 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
2f260 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  d. .          **
2f270 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
2f280 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
2f290 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63  orrupt, the xRec
2f2a0 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69  ordCompare routi
2f2b0 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20  ne may read.    
2f2c0 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74        ** up to t
2f2d0 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20  wo varints past 
2f2e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2f2f0 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20  uffer. An extra 
2f300 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  18 .          **
2f310 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
2f320 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  g is allocated a
2f330 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2f340 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20   buffer in.     
2f350 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69       ** case thi
2f360 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20  s happens.  */. 
2f370 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
2f380 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2f390 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
2f3a0 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
2f3b0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
2f3c0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2f3d0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
2f3e0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  ll(pPage, pCellB
2f3f0 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
2f400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
2f410 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
2f420 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
2f430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2f440 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54  Cell<0 );   /* T
2f450 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20  rue if key size 
2f460 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20  is 2^32 or more 
2f470 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2f480 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20  tcase( nCell==0 
2f490 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2f4a0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2f4b0 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20  x80 0x00 */.    
2f4c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f4d0 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20  nCell==1 );  /* 
2f4e0 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2f4f0 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2f500 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  1 */.          t
2f510 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2f520 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  2 );  /* Minimum
2f530 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79   legal index key
2f540 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20   size */.       
2f550 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29     if( nCell<2 )
2f560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2f570 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2f580 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2f590 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2f5a0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2f5b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2f5c0 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
2f5d0 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38  Malloc( nCell+18
2f5e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2f5f0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
2f600 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f610 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2f620 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2f630 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2f640 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2f650 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2f660 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2f670 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2f680 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
2f690 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
2f6a0 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
2f6b0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
2f6c0 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20  llKey, 2);.     
2f6d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2f6e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f6f0 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2f700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2f710 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2f720 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2f730 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2f740 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2f750 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2f760 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2f770 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2f780 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2f790 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2f7a0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2f7b0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2f7c0 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2f7d0 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2f7e0 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2f7f0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2f800 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2f810 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2f820 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2f830 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2f840 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2f850 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2f860 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2f870 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2f880 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2f890 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f8a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f8b0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2f8c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2f8d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f8e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2f8f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2f900 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2f910 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2f920 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2f930 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2f940 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2f950 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2f960 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2f970 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2f980 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2f990 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f9a0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2f9b0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2f9c0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2f9d0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2f9e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2f9f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2fa00 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2fa10 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2fa20 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2fa30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fa40 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2fa50 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2fa60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2fa70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2fa80 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
2fa90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2faa0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
2fab0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2fac0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2fad0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
2fae0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
2faf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2fb00 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2fb10 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
2fb20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2fb30 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
2fb40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2fb50 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2fb60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2fb70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2fb80 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2fb90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
2fba0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
2fbb0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
2fbc0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
2fbd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2fbe0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2fbf0 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
2fc00 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2fc10 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
2fc20 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
2fc30 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
2fc40 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2fc50 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2fc60 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2fc70 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2fc80 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2fc90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2fca0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2fcb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2fcc0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
2fcd0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
2fce0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
2fcf0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
2fd00 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
2fd10 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
2fd20 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
2fd30 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
2fd40 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2fd50 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
2fd60 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
2fd70 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
2fd80 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
2fd90 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
2fda0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2fdb0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2fdc0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
2fdd0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
2fde0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
2fdf0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
2fe00 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2fe10 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
2fe20 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
2fe30 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
2fe40 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
2fe50 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
2fe60 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
2fe70 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
2fe80 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
2fe90 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
2fea0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
2feb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
2fec0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
2fed0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2fee0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2fef0 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2ff00 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2ff10 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2ff20 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2ff30 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2ff40 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2ff50 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
2ff60 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2ff70 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2ff80 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2ff90 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
2ffa0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
2ffb0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2ffc0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2ffd0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
2ffe0 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2fff0 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
30000 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
30010 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
30020 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
30030 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
30040 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
30050 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
30060 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
30070 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
30080 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
30090 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
300a0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
300b0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
300c0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
300d0 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
300e0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
300f0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
30100 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
30110 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
30120 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
30130 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
30140 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
30150 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
30160 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
30170 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
30180 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
30190 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
301a0 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
301b0 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
301c0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
301d0 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
301e0 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
301f0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
30200 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
30210 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
30220 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
30230 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
30240 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
30250 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
30260 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
30270 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
30280 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
30290 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
302a0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
302b0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
302c0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
302d0 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
302e0 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
302f0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
30300 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
30310 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
30320 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
30330 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
30340 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
30350 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
30360 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
30370 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
30380 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
30390 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
303a0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
303b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
303c0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
303d0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
303e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
303f0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
30400 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
30410 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
30420 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
30430 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30440 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
30450 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
30460 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
30470 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
30480 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
304a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
304b0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
304c0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
304d0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
304e0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
304f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30500 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
30510 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
30520 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30530 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
30540 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
30550 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
30560 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
30570 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
30580 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
30590 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
305a0 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
305b0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
305c0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
305d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
305e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
305f0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
30600 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
30610 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
30620 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
30630 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
30640 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
30650 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
30660 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
30670 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
30680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30690 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
306a0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
306b0 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
306c0 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
306d0 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
306e0 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
306f0 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
30700 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
30710 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
30720 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
30730 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
30740 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
30750 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
30760 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
30770 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
30780 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
30790 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
307a0 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
307b0 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
307c0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
307d0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
307e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
307f0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
30800 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
30810 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
30820 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
30830 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
30840 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
30850 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
30860 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
30870 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
30880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
30890 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
308a0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
308b0 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
308c0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
308d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
308e0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
308f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
30900 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
30910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30920 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30930 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
30940 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
30950 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
30960 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
30970 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
30980 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
30990 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
309a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
309b0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
309c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
309d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
309e0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
309f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
30a20 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
30a30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30a40 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
30a50 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
30a60 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
30a70 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
30a80 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
30a90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
30aa0 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
30ab0 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
30ac0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
30ad0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
30ae0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
30af0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
30b00 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
30b10 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
30b20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
30b30 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
30b40 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
30b50 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
30b60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
30b70 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
30b80 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
30b90 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
30ba0 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
30bb0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
30bc0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
30bd0 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
30be0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
30bf0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
30c00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
30c10 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
30c20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
30c30 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e  iPage])>=pPage->
30c40 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
30c50 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
30c60 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74  Page]--;.    ret
30c70 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
30c80 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
30c90 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
30ca0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
30cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
30cc0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
30cd0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
30ce0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
30cf0 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
30d00 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
30d10 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
30d20 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
30d30 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
30d40 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
30d50 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
30d60 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
30d70 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
30d80 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
30d90 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
30da0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
30db0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
30dc0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
30dd0 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
30de0 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
30df0 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
30e00 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
30e10 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
30e20 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
30e30 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
30e40 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
30e50 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
30e60 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
30e70 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
30e80 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
30e90 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
30ea0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
30eb0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
30ec0 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
30ed0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
30ee0 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
30ef0 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
30f00 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
30f10 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
30f20 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
30f30 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
30f40 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
30f50 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
30f60 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
30f70 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
30f80 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
30f90 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
30fa0 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
30fb0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
30fc0 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
30fd0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
30fe0 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
30ff0 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
31000 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
31010 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
31020 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
31030 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
31040 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
31050 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
31060 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
31070 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
31080 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
31090 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
310a0 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
310b0 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
310c0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
310d0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
310e0 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
310f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
31100 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
31110 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
31120 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
31130 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
31140 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
31150 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
31160 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
31170 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  t btreePrevious(
31180 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
31190 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
311a0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
311b0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
311c0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
311d0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
311e0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
311f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
31200 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res==0 );.  asse
31210 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
31220 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
31230 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
31240 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
31250 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
31260 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
31270 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
31280 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
31290 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
312a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
312b0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
312c0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
312d0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
312e0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
312f0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
31300 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
31330 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
31340 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
31350 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
31360 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
31370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31390 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
313a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
313b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
313c0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
313d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
313e0 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
313f0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
31400 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
31410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
31420 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
31430 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
31440 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
31450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31460 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
31470 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
31480 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
31490 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
314a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
314b0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
314c0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
314d0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
314e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
314f0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
31500 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
31510 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
31520 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
31530 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
31540 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
31550 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
31560 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
31570 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
31580 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
31590 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
315a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
315b0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
315c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
315d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
315e0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
315f0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
31600 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
31610 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31620 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
31630 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
31640 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
31650 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
31660 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
31670 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
31680 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
31690 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79   (BTCF_ValidNKey
316a0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
316b0 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75  )==0 );..    pCu
316c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
316d0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
316e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
316f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
31700 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
31710 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
31720 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
31730 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
31740 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
31750 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
31760 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31770 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
31780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31790 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
317a0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
317b0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
317c0 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  es){.  assert( c
317d0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
317e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
317f0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
31800 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
31810 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
31820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
31830 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
31840 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
31850 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
31860 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43   *pRes = 0;.  pC
31870 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
31880 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
31890 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
318a0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20  F_ValidNKey);.  
318b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
318c0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
318d0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
318e0 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75  _VALID.   || pCu
318f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
31900 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70  Page]==0.   || p
31910 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
31920 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d  ->iPage]->leaf==
31930 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
31940 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  n btreePrevious(
31950 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
31960 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
31970 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
31980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
319a0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
319b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
319c0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
319d0 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
319e0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
319f0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
31a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31a10 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
31a20 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
31a30 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
31a40 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
31a50 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
31a60 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
31a70 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
31a80 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
31a90 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
31aa0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
31ab0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
31ac0 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
31ad0 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
31ae0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
31af0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
31b00 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
31b10 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
31b20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
31b30 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
31b40 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65   NULL in the eve
31b50 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
31b60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
31b70 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
31b80 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
31b90 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
31ba0 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
31bb0 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
31bc0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
31bd0 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
31be0 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
31bf0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
31c00 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
31c10 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
31c20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
31c30 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
31c40 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
31c50 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
31c60 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
31c70 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
31c80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
31c90 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
31ca0 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
31cb0 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
31cc0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
31cd0 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
31ce0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
31cf0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
31d00 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
31d10 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
31d20 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
31d30 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
31d40 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
31d50 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
31d60 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
31d70 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
31d80 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
31d90 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
31da0 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
31db0 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
31dc0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
31dd0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
31de0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
31df0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
31e00 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
31e10 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
31e20 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
31e30 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
31e40 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
31e50 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
31e60 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
31e70 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
31e80 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
31e90 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
31ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
31eb0 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
31ec0 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
31ed0 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
31ee0 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
31ef0 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
31f00 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
31f10 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
31f20 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
31f30 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
31f40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31f50 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
31f60 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
31f70 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
31f80 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
31f90 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
31fa0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
31fb0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
31fc0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
31fd0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
31fe0 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
31ff0 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
32000 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
32010 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
32020 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
32030 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
32040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
32050 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
32060 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
32070 20 52 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20   REQUIRE_PTRMAP 
32080 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
32090 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
320a0 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
320b0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f  ecount(pBt);.  /
320c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
320d0 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65  -05119-02637 The
320e0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
320f0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
32100 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f  fset 36.  ** sto
32110 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74  res stores the t
32120 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
32130 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
32140 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67  list. */.  n = g
32150 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
32160 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
32170 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
32180 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 49 53  ge-1 );.  if( IS
32190 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20 26 26  CONCURRENT==0 &&
321a0 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
321b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
321c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
321d0 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 70  }..  /* Ensure p
321e0 61 67 65 20 31 20 69 73 20 77 72 69 74 61 62 6c  age 1 is writabl
321f0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
32200 20 77 69 6c 6c 20 65 69 74 68 65 72 20 63 68 61   will either cha
32210 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  nge the number. 
32220 20 2a 2a 20 6f 66 20 70 61 67 65 73 20 69 6e 20   ** of pages in 
32230 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 72  the free-list or
32240 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
32250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
32260 53 69 6e 63 65 20 62 6f 74 68 0a 20 20 2a 2a 20  Since both.  ** 
32270 6f 66 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  of these operati
32280 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d 6f 64 69  ons involve modi
32290 66 79 69 6e 67 20 70 61 67 65 20 31 20 68 65 61  fying page 1 hea
322a0 64 65 72 20 66 69 65 6c 64 73 2c 20 70 61 67 65  der fields, page
322b0 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20 64 65 66   1.  ** will def
322c0 69 6e 69 74 65 6c 79 20 62 65 20 77 72 69 74 74  initely be writt
322d0 65 6e 20 62 79 20 74 68 69 73 20 74 72 61 6e 73  en by this trans
322e0 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  action. If this 
322f0 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54  is an CONCURRENT
32300 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
32310 6e 2c 20 65 6e 73 75 72 65 20 74 68 65 20 42 74  n, ensure the Bt
32320 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74  reePtrmap struct
32330 75 72 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ure has been all
32340 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 72 63  ocated.  */.  rc
32350 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32360 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
32370 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
32380 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
32390 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
323a0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
323b0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
323c0 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
323d0 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
323e0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
323f0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
32400 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
32410 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
32420 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
32430 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
32440 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
32450 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
32460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
32470 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
32480 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
32490 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
324a0 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
324b0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
324c0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
324d0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
324e0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
324f0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
32500 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
32510 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
32520 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
32530 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
32540 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
32550 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
32560 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
32570 20 61 73 73 65 72 74 28 20 49 53 41 55 54 4f 56   assert( ISAUTOV
32580 41 43 55 55 4d 21 3d 49 53 43 4f 4e 43 55 52 52  ACUUM!=ISCONCURR
32590 45 4e 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ENT );.      if(
325a0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
325b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
325c0 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
325d0 20 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70           u8 eTyp
325e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e;.          ass
325f0 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
32600 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
32610 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
32620 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  um );.          
32630 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
32640 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
32650 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
32660 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32670 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
32680 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
32690 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
326a0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
326b0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
326c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
326d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
326e0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
326f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
32700 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
32710 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
32720 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
32730 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
32740 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
32750 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
32760 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
32770 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
32780 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
32790 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
327a0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
327b0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
327c0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
327d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
327e0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
327f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
32800 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
32810 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
32820 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
32830 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
32840 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
32850 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
32860 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
32870 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
32880 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
32890 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
328a0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
328b0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
328c0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
328d0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
328e0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
328f0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
32900 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
32910 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
32920 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
32930 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
32940 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
32950 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
32960 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
32970 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
32980 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
32990 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
329a0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
329b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
329c0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
329d0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
329e0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
329f0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
32a00 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
32a10 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
32a20 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
32a30 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
32a40 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
32a50 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
32a60 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
32a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32a80 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
32a90 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
32aa0 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
32ab0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
32ac0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
32ad0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
32ae0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
32af0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
32b00 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
32b10 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
32b20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
32b30 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
32b40 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
32b50 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
32b60 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
32b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
32b80 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
32b90 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
32ba0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
32bb0 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
32bc0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
32bd0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32be0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
32bf0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
32c00 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32c10 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
32c20 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
32c30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32c40 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
32c50 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
32c60 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32c70 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32c80 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
32c90 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
32ca0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
32cb0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
32cc0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
32cd0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
32ce0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
32cf0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
32d00 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
32d10 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
32d20 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
32d30 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
32d40 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
32d50 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
32d60 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
32d70 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
32d80 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
32d90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
32da0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
32db0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
32dc0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
32dd0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
32de0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
32df0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
32e00 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
32e10 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
32e20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
32e30 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
32e40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
32e50 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
32e60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32e70 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32e80 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32e90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32ea0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32eb0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32ec0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32ed0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
32ee0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
32ef0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
32f00 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
32f10 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32f20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
32f30 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
32f40 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32f50 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
32f60 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
32f70 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
32f80 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
32f90 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
32fa0 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
32fb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
32fc0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
32fd0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
32fe0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
32ff0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
33000 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
33010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
33020 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
33030 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
33040 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
33050 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33060 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
33070 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
33080 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
33090 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
330a0 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
330b0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
330c0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
330d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
330e0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
330f0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
33100 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
33110 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
33120 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
33130 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
33140 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
33150 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
33160 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
33170 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
33180 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
33190 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
331a0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
331b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
331c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
331d0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
331e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
331f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
33200 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
33210 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
33220 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
33230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
33240 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
33250 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
33260 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
33270 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
33280 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
33290 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
332a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
332b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
332c0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
332d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
332e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
332f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33300 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
33310 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
33320 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
33330 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
33340 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
33350 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
33360 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
33370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33390 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
333a0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
333b0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
333c0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
333d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
333e0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
333f0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
33400 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
33410 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
33420 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
33430 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
33440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33450 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
33460 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
33470 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
33480 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
33490 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
334a0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
334b0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
334c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
334d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
334e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
334f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
33500 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
33510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33520 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
33530 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
33540 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
33550 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
33560 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
33570 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
33580 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
335a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
335b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
335c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
335d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
335e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
335f0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
33600 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
33610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33620 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33630 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
33640 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
33650 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
33660 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
33670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33680 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
33690 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
336a0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
336b0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
336c0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
336d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
336e0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
336f0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
33700 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
33710 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
33720 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
33730 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
33740 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
33750 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
33760 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
33770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
33780 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33790 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
337a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
337b0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
337c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
337d0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
337e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
337f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
33800 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33810 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
33820 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
33830 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
33840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
33850 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
33860 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
33870 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
33880 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
33890 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
338a0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
338b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
338c0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
338d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
338e0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
338f0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
33900 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
33910 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
33920 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
33930 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
33940 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
33950 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
33960 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
33970 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
33980 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
33990 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
339a0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
339b0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
339c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
339d0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
339e0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
339f0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
33a00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33a10 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
33a20 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
33a30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
33a40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
33a50 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
33a60 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
33a70 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
33a80 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
33a90 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
33aa0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
33ab0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
33ac0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
33ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33b00 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
33b10 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
33b20 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
33b30 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
33b40 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
33b50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
33b60 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
33b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33b80 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
33b90 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
33ba0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
33bb0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
33bc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
33bd0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
33be0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
33bf0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
33c00 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
33c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
33c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33c30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33c50 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
33c60 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
33c70 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
33c80 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
33c90 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
33ca0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
33cb0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
33cc0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
33cd0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
33ce0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33cf0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
33d00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
33d10 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
33d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33d30 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
33d40 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
33d50 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
33d60 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
33d70 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
33d80 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
33d90 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
33da0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
33db0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
33dc0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
33dd0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
33de0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
33df0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
33e00 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
33e10 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
33e20 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
33e30 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
33e40 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
33e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33e60 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
33e70 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
33e80 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
33e90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33ea0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
33eb0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
33ec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
33ed0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
33ee0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
33ef0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
33f00 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
33f10 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
33f20 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
33f30 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
33f40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
33f50 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
33f60 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
33f70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
33f80 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
33f90 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
33fa0 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
33fb0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
33fc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
33fd0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
33fe0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
33ff0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
34000 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
34010 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
34030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34040 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
34050 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
34060 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
34070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34080 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
34090 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
340a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
340b0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
340c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
340d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
340e0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
340f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34100 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
34110 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
34120 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
34130 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
34140 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
34150 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34160 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
34170 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
34180 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
34190 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
341a0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
341b0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
341c0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
341d0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
341e0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
341f0 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
34200 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
34210 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
34220 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
34230 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
34240 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
34250 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
34260 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
34270 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
34280 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
34290 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
342a0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
342b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
342c0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
342d0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
342e0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
342f0 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
34300 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
34310 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
34320 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
34330 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
34340 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
34350 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
34360 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
34370 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
34380 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
34390 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
343a0 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
343b0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
343c0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
343d0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
343e0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
343f0 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
34400 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
34410 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
34420 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
34430 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
34440 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
34450 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
34460 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
34470 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
34480 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
34490 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
344a0 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
344b0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
344c0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
344d0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
344e0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
344f0 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
34500 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
34510 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
34520 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
34530 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
34540 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
34550 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
34560 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
34570 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
34580 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
34590 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
345a0 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
345b0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
345c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
345d0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
345e0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
345f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
34600 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
34610 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
34620 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
34630 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
34640 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
34650 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
34660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34670 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
34680 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34690 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
346a0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
346b0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
346c0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
346d0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
346e0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
346f0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
34700 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
34710 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
34720 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
34730 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
34740 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
34750 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
34760 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
34770 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
34780 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
34790 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
347a0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
347b0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
347c0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
347d0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
347e0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
347f0 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
34800 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
34810 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
34820 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
34830 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
34840 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
34850 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
34860 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
34870 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
34880 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34890 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
348a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
348b0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
348c0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
348d0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
348e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
348f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
34900 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
34910 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
34920 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
34930 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
34940 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
34950 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
34960 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
34970 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
34980 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
34990 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
349a0 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
349b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
349c0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
349d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
349e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
349f0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
34a00 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
34a10 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
34a20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34a30 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
34a40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34a50 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
34a60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
34a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34a80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34a90 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
34aa0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
34ab0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
34ac0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
34ad0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
34ae0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
34af0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
34b00 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
34b10 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
34b20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
34b30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34b40 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
34b50 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
34b60 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
34b70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
34b80 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
34b90 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
34ba0 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
34bb0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
34bc0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
34bd0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
34be0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
34c00 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
34c10 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
34c20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34c30 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
34c40 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
34c50 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
34c60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
34c70 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
34c80 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
34c90 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
34ca0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
34cb0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
34cc0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
34cd0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
34ce0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
34cf0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
34d00 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
34d10 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
34d20 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
34d30 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
34d40 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
34d50 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
34d60 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
34d70 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
34d80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
34d90 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
34da0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
34db0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
34dc0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
34dd0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
34de0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
34df0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
34e00 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
34e10 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
34e20 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
34e30 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
34e40 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
34e50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
34e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e70 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
34e80 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
34e90 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
34ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34eb0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
34ec0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
34ed0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
34ee0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
34ef0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
34f00 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
34f10 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
34f20 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
34f30 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
34f40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34f50 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
34f60 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
34f70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
34f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
34fa0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
34fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
34fd0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
34fe0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
34ff0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
35000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
35010 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
35020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
35030 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
35040 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
35050 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
35060 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
35070 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
35080 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
35090 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
350a0 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
350b0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
350c0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
350d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
350e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
350f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
35100 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
35110 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
35120 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
35130 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
35140 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
35150 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
35160 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35170 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
35180 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
35190 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
351a0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
351b0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
351c0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
351d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
351e0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
351f0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
35200 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
35210 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
35220 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
35230 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
35240 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
35250 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
35260 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
35270 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
35280 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
35290 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
352a0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
352b0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
352c0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
352d0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
352e0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
352f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35300 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
35310 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
35320 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
35330 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
35340 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
35350 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
35360 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
35370 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
35380 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
35390 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
353a0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
353b0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
353c0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
353d0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
353e0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
353f0 20 2a 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52   */.  if( REQUIR
35400 45 5f 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20  E_PTRMAP ){.    
35410 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
35420 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
35430 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
35440 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35450 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
35460 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
35470 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
35480 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
35490 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
354a0 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
354b0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
354c0 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
354d0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
354e0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
354f0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
35500 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
35510 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
35520 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
35530 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
35540 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
35550 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
35560 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
35570 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
35580 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
35590 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
355a0 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
355b0 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
355c0 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
355d0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
355e0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
355f0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
35600 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
35610 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
35620 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
35630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35640 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
35650 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
35660 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
35670 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
35680 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
35690 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
356a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
356b0 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
356c0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
356d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
356e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
356f0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
35700 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
35710 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
35720 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
35730 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
35740 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
35750 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
35760 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
35770 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
35780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
35790 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
357a0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
357b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
357c0 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
357d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
357e0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
357f0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
35800 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
35810 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
35820 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
35830 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
35840 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
35850 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
35860 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
35870 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
35880 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
35890 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
358a0 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
358b0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
358c0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
358d0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
358e0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
358f0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
35900 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
35910 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
35920 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
35930 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
35940 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
35950 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
35960 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
35970 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
35980 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
35990 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
359a0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
359b0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
359c0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
359d0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
359e0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
359f0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
35a00 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
35a10 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
35a20 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
35a30 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
35a40 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
35a50 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
35a60 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
35a70 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
35a80 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
35a90 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
35aa0 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
35ab0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
35ac0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
35ad0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
35ae0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
35af0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
35b00 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
35b10 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
35b20 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
35b30 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
35b40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
35b50 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
35b60 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72  20-11576 However
35b70 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  , newer versions
35b80 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c   of SQLite still
35b90 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20  .      ** avoid 
35ba0 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73  using the last s
35bb0 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ix entries in th
35bc0 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
35bd0 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20   page array in. 
35be0 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68       ** order th
35bf0 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
35c00 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77  s created by new
35c10 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
35c20 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20  QLite can be.   
35c30 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c     ** read by ol
35c40 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
35c50 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f  SQLite..      */
35c60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
35c70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
35c80 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
35c90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35cb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
35cc0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
35cd0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
35ce0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
35cf0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
35d00 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
35d10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
35d20 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
35d30 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
35d40 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
35d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
35d60 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
35d70 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
35d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
35d90 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
35da0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
35db0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
35dc0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
35dd0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
35de0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
35df0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
35e00 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
35e10 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
35e20 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
35e30 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
35e40 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
35e50 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
35e60 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
35e70 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
35e80 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
35e90 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
35ea0 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
35eb0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
35ec0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
35ed0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
35ee0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
35ef0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
35f00 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
35f10 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
35f20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
35f30 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
35f40 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
35f50 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
35f60 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
35f70 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
35f80 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
35f90 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
35fa0 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
35fb0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
35fc0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
35fd0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
35fe0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
35ff0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
36000 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
36010 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
36020 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
36030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36040 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
36050 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
36060 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
36070 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
36080 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
36090 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
360a0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
360b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
360c0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
360d0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
360e0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
360f0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
36100 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
36110 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
36120 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
36130 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
36140 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
36150 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
36160 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
36170 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
36180 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
36190 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
361a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
361b0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
361c0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
361d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
361e0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
361f0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
36200 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
36210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
36220 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
36230 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
36240 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
36250 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
36260 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20  local Cell size 
36270 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  (the number of b
36280 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67  ytes on the orig
36290 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74  inal page, omitt
362a0 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29  ing.** overflow)
362b0 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a   into *pnSize..*
362c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
362d0 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  arCell(.  MemPag
362e0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
362f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
36300 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
36310 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   Cell */.  unsig
36320 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
36330 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
36340 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f  e of the Cell */
36350 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20  .  u16 *pnSize  
36360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
36370 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  rite the size of
36380 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a   the Cell here *
36390 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
363a0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
363b0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
363c0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
363d0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
363e0 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
363f0 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
36400 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36410 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
36420 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
36430 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
36440 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
36450 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
36460 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
36470 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f  Size;.  if( info
36480 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66 6f 2e 6e 50  .nLocal==info.nP
36490 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65  ayload ){.    re
364a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
364b0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
364c0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
364d0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
364e0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
364f0 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  ( pCell+info.nSi
36500 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44  ze-1 > pPage->aD
36510 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
36520 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
36530 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
36540 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
36550 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
36560 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
36570 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
36580 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 69 6e  4byte(pCell + in
36590 66 6f 2e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20  fo.nSize - 4);. 
365a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
365b0 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
365c0 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
365d0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
365e0 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
365f0 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
36600 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
36610 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
36620 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
36630 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30   assert( nOvfl>0
36640 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50   || .    (CORRUP
36650 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50  T_DB && (info.nP
36660 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67  ayload + ovflPag
36670 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53  eSize)<ovflPageS
36680 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c  ize).  );.  whil
36690 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
366a0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
366b0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
366c0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
366d0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
366e0 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
366f0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
36700 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
36710 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
36720 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
36730 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
36740 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
36750 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
36760 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
36770 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
36780 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
36790 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
367a0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
367b0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
367c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
367d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
367e0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
367f0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
36800 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
36810 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
36820 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
36830 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36840 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
36850 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
36860 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
36870 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
36880 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
36890 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
368a0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
368b0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
368c0 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
368d0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
368e0 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
368f0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
36900 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
36910 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
36920 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
36930 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
36940 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
36950 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
36960 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
36970 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
36980 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
36990 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
369a0 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
369b0 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
369c0 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
369d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
369e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
369f0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
36a00 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
36a10 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
36a20 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
36a30 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
36a40 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
36a50 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
36a60 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
36a70 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
36a80 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
36a90 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
36aa0 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
36ab0 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
36ac0 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
36ad0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
36ae0 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
36af0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
36b00 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
36b10 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
36b20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
36b30 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
36b40 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
36b50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
36b60 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
36b70 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
36b80 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
36b90 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
36ba0 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
36bb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
36bc0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
36bd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
36be0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
36bf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
36c00 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
36c10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
36c20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
36c30 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
36c40 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
36c50 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
36c60 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
36c70 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
36c80 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
36c90 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
36ca0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
36cb0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
36cc0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
36cd0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
36ce0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
36cf0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
36d00 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
36d10 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
36d20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
36d30 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
36d40 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
36d50 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
36d60 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
36d70 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
36d80 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
36d90 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
36da0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
36db0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
36dc0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
36dd0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
36de0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
36df0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
36e00 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
36e10 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
36e20 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
36e30 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
36e40 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
36e50 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
36e60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
36e70 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
36e80 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
36e90 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
36ea0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
36eb0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
36ec0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
36ed0 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61  onst BtreePayloa
36ee0 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a  d *pX,        /*
36ef0 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68   Payload with wh
36f00 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
36f10 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
36f20 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
36f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f40 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
36f50 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
36f60 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
36f70 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
36f80 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
36f90 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
36fa0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
36fb0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
36fc0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
36fd0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
36fe0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
36ff0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
37000 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
37010 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
37020 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
37030 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
37040 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65  nHeader;..  asse
37050 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37060 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
37070 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
37080 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
37090 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
370a0 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
370b0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
370c0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
370d0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
370e0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
370f0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
37100 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
37110 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
37120 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
37130 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
37140 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
37150 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
37160 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37170 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
37180 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
37190 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
371a0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  .  nHeader = pPa
371b0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
371c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
371d0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61  ntKey ){.    nPa
371e0 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74  yload = pX->nDat
371f0 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20  a + pX->nZero;. 
37200 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44     pSrc = pX->pD
37210 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
37220 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61  pX->nData;.    a
37230 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
37240 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66  tKeyLeaf ); /* f
37250 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79  illInCell() only
37260 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76   called for leav
37270 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65  es */.    nHeade
37280 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
37290 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
372a0 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
372b0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
372c0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
372d0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70  ader], *(u64*)&p
372e0 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73  X->nKey);.  }els
372f0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
37300 58 2d 3e 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20  X->nData==0 );. 
37310 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e     assert( pX->n
37320 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Zero==0 );.    a
37330 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c  ssert( pX->nKey<
37340 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
37350 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20  X->pKey!=0 );.  
37360 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61    nSrc = nPayloa
37370 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65  d = (int)pX->nKe
37380 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58  y;.    pSrc = pX
37390 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61  ->pKey;.    nHea
373a0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
373b0 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
373c0 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
373d0 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20   }.  .  /* Fill 
373e0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
373f0 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  /.  if( nPayload
37400 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
37410 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65  l ){.    n = nHe
37420 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
37430 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
37440 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
37450 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
37460 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
37470 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
37480 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
37490 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
374a0 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b   pPrior = pCell;
374b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
374c0 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69  t mn = pPage->mi
374d0 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20  nLocal;.    n = 
374e0 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  mn + (nPayload -
374f0 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70   mn) % (pPage->p
37500 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
37510 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
37520 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
37530 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
37540 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
37550 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
37560 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65     if( n > pPage
37570 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d  ->maxLocal ) n =
37580 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65   mn;.    spaceLe
37590 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53  ft = n;.    *pnS
375a0 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
375b0 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f  r + 4;.    pPrio
375c0 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
375d0 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  er+n];.  }.  pPa
375e0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
375f0 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41  Header];..  /* A
37600 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72  t this point var
37610 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65  iables should be
37620 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
37630 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61  .  **.  **   nPa
37640 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
37650 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
37660 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a  ze in bytes.  **
37670 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20     pPayload     
37680 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74        Begin writ
37690 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65  ing payload here
376a0 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66  .  **   spaceLef
376b0 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65  t          Space
376c0 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50   available at pP
376d0 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79  ayload.  If nPay
376e0 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a  load>spaceLeft,.
376f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
37700 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d            that m
37710 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73  eans content mus
37720 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65  t spill into ove
37730 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a  rflow pages..  *
37740 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  *   *pnSize     
37750 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74         Size of t
37760 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e  he local cell (n
37770 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72  ot counting over
37780 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a  flow pages).  **
37790 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20     pPrior       
377a0 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77        Where to w
377b0 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66  rite the pgno of
377c0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
377d0 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20  low page.  **.  
377e0 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f  ** Use a call to
377f0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
37800 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74  tr() to verify t
37810 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61  hat the values a
37820 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63  bove.  ** were c
37830 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c  omputed correctl
37840 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49  y..  */.#if SQLI
37850 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
37860 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
37870 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
37880 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
37890 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
378a0 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
378b0 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79  =(int)(info.pPay
378c0 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b  load - pCell) );
378d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66  .    assert( inf
378e0 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79  o.nKey==pX->nKey
378f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37900 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
37910 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
37920 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
37930 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
37940 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
37950 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
37960 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
37970 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
37980 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
37990 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
379a0 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
379b0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
379c0 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
379d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
379e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
379f0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
37a00 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
37a10 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
37a20 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
37a30 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
37a40 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
37a50 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
37a60 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
37a70 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
37a80 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
37a90 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
37aa0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
37ab0 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
37ac0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
37ad0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
37ae0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
37af0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
37b00 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
37b10 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
37b20 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
37b30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
37b40 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
37b50 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
37b60 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
37b70 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
37b80 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
37b90 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
37ba0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
37bb0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
37bc0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
37bd0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
37be0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
37bf0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
37c00 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
37c10 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
37c20 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
37c30 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
37c40 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
37c50 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
37c60 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
37c70 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
37c80 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
37c90 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
37ca0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
37cb0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
37cc0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
37cd0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
37ce0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
37cf0 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
37d00 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
37d10 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
37d20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
37d30 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
37d40 20 20 20 69 66 28 20 52 45 51 55 49 52 45 5f 50     if( REQUIRE_P
37d50 54 52 4d 41 50 20 26 26 20 72 63 3d 3d 53 51 4c  TRMAP && rc==SQL
37d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37d70 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
37d80 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
37d90 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
37da0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
37db0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
37dc0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
37dd0 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
37de0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
37df0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
37e00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37e10 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
37e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37e30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
37e40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
37e50 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
37e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
37e70 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
37e80 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
37e90 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
37ea0 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
37eb0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
37ec0 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
37ed0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
37ee0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
37ef0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
37f00 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
37f10 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
37f20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
37f30 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
37f40 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
37f50 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
37f60 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
37f70 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
37f80 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
37f90 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
37fa0 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
37fb0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
37fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
37fd0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
37fe0 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
37ff0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
38000 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
38010 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
38020 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
38030 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
38040 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
38050 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
38060 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
38070 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
38080 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
38090 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
380a0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
380b0 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
380c0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
380d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
380e0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
380f0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
38100 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
38110 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
38120 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
38130 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
38140 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
38150 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
38160 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
38170 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
38180 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
38190 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
381a0 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
381b0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
381c0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
381d0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
381e0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
381f0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
38200 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
38210 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
38220 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
38230 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
38240 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
38250 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
38260 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
38270 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
38280 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
38290 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
382a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
382b0 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
382c0 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
382d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
382e0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
382f0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
38300 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
38310 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
38320 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
38330 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
38340 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
38350 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
38360 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
38370 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
38380 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
38390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
383a0 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
383b0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
383c0 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
383d0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
383e0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
383f0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
38400 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
38410 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   n;.  }.  releas
38420 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
38430 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
38440 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
38450 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
38460 63