/ Hex Artifact Content
Login

Artifact 13f924763ebd6bd55e0b74d139ee363a42abbe0f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 0a  ARED_CACHE */...
3a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3a80: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 45 44 0a 2f 2a  ABLE_UNLOCKED./*
3a90: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3aa0: 67 20 73 74 72 75 63 74 75 72 65 20 2d 20 42 74  g structure - Bt
3ab0: 72 65 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72  reePtrmap - stor
3ac0: 65 73 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  es the in-memory
3ad0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20   pointer map.** 
3ae0: 75 73 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61  used for newly a
3af0: 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20 69  llocated pages i
3b00: 6e 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61 6e 73  n UNLOCKED trans
3b10: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3b20: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3b30: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3b40: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3b50: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3b60: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3b70: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3b80: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3b90: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3ba0: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3bb0: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3bc0: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3bd0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3be0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3bf0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3c00: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3c10: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3c20: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
3c30: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
3c40: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
3c50: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
3c60: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
3c70: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
3c80: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
3c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3ca0: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
3cb0: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
3cc0: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
3cf0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
3d00: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
3d10: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
3d20: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
3d30: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
3d40: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
3d50: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d70: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
3d80: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
3d90: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
3dc0: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
3dd0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
3e00: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
3e10: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
3e20: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
3e30: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
3e40: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
3e50: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
3e60: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
3e70: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
3e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
3e90: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
3ea0: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
3eb0: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
3ec0: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
3ed0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
3ee0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
3ef0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ies */.};../*.**
3f00: 20 49 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20   If page number 
3f10: 70 67 6e 6f 20 69 73 20 67 72 65 61 74 65 72 20  pgno is greater 
3f20: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
3f30: 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69 46 69   BtreePtrmap.iFi
3f40: 72 73 74 2c 20 0a 2a 2a 20 73 74 6f 72 65 20 61  rst, .** store a
3f50: 6e 20 65 6e 74 72 79 20 66 6f 72 20 69 74 20 69  n entry for it i
3f60: 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
3f70: 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  p structure..*/.
3f80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
3f90: 50 74 72 6d 61 70 53 74 6f 72 65 28 0a 20 20 42  PtrmapStore(.  B
3fa0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 0a 20 20  tShared *pBt,.  
3fb0: 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20 20 75 38 20  Pgno pgno,.  u8 
3fc0: 65 54 79 70 65 2c 20 0a 20 20 50 67 6e 6f 20 70  eType, .  Pgno p
3fd0: 61 72 65 6e 74 0a 29 7b 0a 20 20 42 74 72 65 65  arent.){.  Btree
3fe0: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
3ff0: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4000: 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e 69 46 69 72  pgno>=pMap->iFir
4010: 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 45  st ){.    int iE
4020: 6e 74 72 79 20 3d 20 70 67 6e 6f 20 2d 20 70 4d  ntry = pgno - pM
4030: 61 70 2d 3e 69 46 69 72 73 74 3b 0a 0a 20 20 20  ap->iFirst;..   
4040: 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 61 50 74   /* Grow the aPt
4050: 72 5b 5d 20 61 72 72 61 79 20 61 73 20 72 65 71  r[] array as req
4060: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 77 68 69  uired */.    whi
4070: 6c 65 28 20 69 45 6e 74 72 79 3e 3d 70 4d 61 70  le( iEntry>=pMap
4080: 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 29 7b 0a 20  ->nPtrAlloc ){. 
4090: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
40a0: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
40b0: 3f 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f  ? pMap->nPtrAllo
40c0: 63 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20 20 20  c*2 : 16;.      
40d0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 4e 65  PtrmapEntry *aNe
40e0: 77 20 3d 20 28 50 74 72 6d 61 70 45 6e 74 72 79  w = (PtrmapEntry
40f0: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
4100: 63 28 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  c(.          pMa
4110: 70 2d 3e 61 50 74 72 2c 20 6e 4e 65 77 2a 73 69  p->aPtr, nNew*si
4120: 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e 74 72 79  zeof(PtrmapEntry
4130: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
4140: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4160: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4180: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
4190: 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  New-pMap->nPtrAl
41a0: 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 50 74 72 6d  loc)*sizeof(Ptrm
41b0: 61 70 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20  apEntry);.      
41c0: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
41d0: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c  Map->nPtrAlloc],
41e0: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
41f0: 20 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 20 3d      pMap->aPtr =
4200: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   aNew;.        p
4210: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d  Map->nPtrAlloc =
4220: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4230: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
4240: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
4250: 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 69 66   rollback log if
4260: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4270: 20 69 66 28 20 70 4d 61 70 2d 3e 6e 53 76 70 74   if( pMap->nSvpt
4280: 3e 30 20 26 26 20 70 4d 61 70 2d 3e 61 50 74 72  >0 && pMap->aPtr
4290: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20  [iEntry].parent 
42a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 61  ){.      if( pMa
42b0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d  p->nRollback>=pM
42c0: 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c  ap->nRollbackAll
42d0: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  oc ){.        in
42e0: 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e  t nNew = pMap->n
42f0: 52 6f 6c 6c 62 61 63 6b 20 3f 20 70 4d 61 70 2d  Rollback ? pMap-
4300: 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32 20 3a 20 31  >nRollback*2 : 1
4310: 36 3b 0a 20 20 20 20 20 20 20 20 52 6f 6c 6c 62  6;.        Rollb
4320: 61 63 6b 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d  ackEntry *aNew =
4330: 20 28 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 2a   (RollbackEntry*
4340: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
4350: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  (.            pM
4360: 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e  ap->aRollback, n
4370: 4e 65 77 2a 73 69 7a 65 6f 66 28 52 6f 6c 6c 62  New*sizeof(Rollb
4380: 61 63 6b 45 6e 74 72 79 29 0a 20 20 20 20 20 20  ackEntry).      
4390: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
43a0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
43b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
43c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
43d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
43e0: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
43f0: 61 63 6b 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ack = aNew;.    
4400: 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c        pMap->nRol
4410: 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65  lbackAlloc = nNe
4420: 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
4430: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 61 70     }..      pMap
4440: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70  ->aRollback[pMap
4450: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e  ->nRollback].pgn
4460: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  o = pgno;.      
4470: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4480: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4490: 2e 70 61 72 65 6e 74 20 3d 20 70 4d 61 70 2d 3e  .parent = pMap->
44a0: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
44b0: 65 6e 74 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d  ent;.      pMap-
44c0: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d  >aRollback[pMap-
44d0: 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 65 54 79 70  >nRollback].eTyp
44e0: 65 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69  e = pMap->aPtr[i
44f0: 45 6e 74 72 79 5d 2e 65 54 79 70 65 3b 0a 20 20  Entry].eType;.  
4500: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
4510: 74 65 20 74 68 65 20 61 50 74 72 5b 5d 20 61 72  te the aPtr[] ar
4520: 72 61 79 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d  ray */.    pMap-
4530: 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61  >aPtr[iEntry].pa
4540: 72 65 6e 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20  rent = parent;. 
4550: 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45     pMap->aPtr[iE
4560: 6e 74 72 79 5d 2e 65 54 79 70 65 20 3d 20 65 54  ntry].eType = eT
4570: 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ype;.  }..  retu
4580: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4590: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76 65  ./*.** Open save
45a0: 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
45b0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
45c0: 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f 0a  lready open..*/.
45d0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
45e0: 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53 68  PtrmapBegin(BtSh
45f0: 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 6e  ared *pBt, int n
4600: 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50 74  Svpt){.  BtreePt
4610: 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74  rmap *pMap = pBt
4620: 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d  ->pMap;.  if( pM
4630: 61 70 20 26 26 20 6e 53 76 70 74 3c 70 4d 61 70  ap && nSvpt<pMap
4640: 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20 69  ->nSvpt ){.    i
4650: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 53  nt i;.    if( nS
4660: 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70 74  vpt>=pMap->nSvpt
4670: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
4680: 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e  nt nNew = pMap->
4690: 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d 61  nSvptAlloc ? pMa
46a0: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32 20  p->nSvptAlloc*2 
46b0: 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74 20  : 16;.      int 
46c0: 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *aNew = sqlite3_
46d0: 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61 53  realloc(pMap->aS
46e0: 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  vpt, sizeof(int)
46f0: 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20   * nNew);.      
4700: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
4710: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4720: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4730: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4740: 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20 61   pMap->aSvpt = a
4750: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  New;.        pMa
4760: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d 20  p->nSvptAlloc = 
4770: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
4780: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 70    }..    for(i=p
4790: 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e 53  Map->nSvpt; i<nS
47a0: 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vpt; i++){.     
47b0: 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d 20   pMap->aSvpt[i] 
47c0: 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  = pMap->nRollbac
47d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 61  k;.    }.    pMa
47e0: 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70 74  p->nSvpt = nSvpt
47f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4810: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 28 69 66  .** Rollback (if
4820: 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
4830: 4f 4c 4c 42 41 43 4b 29 20 6f 72 20 72 65 6c 65  OLLBACK) or rele
4840: 61 73 65 20 28 69 66 20 6f 70 3d 3d 53 41 56 45  ase (if op==SAVE
4850: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 0a 2a  POINT_RELEASE).*
4860: 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 53 76 70  * savepoint iSvp
4870: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4880: 64 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e 64  d btreePtrmapEnd
4890: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
48a0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 76 70  int op, int iSvp
48b0: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
48c0: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
48d0: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
48f0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
4900: 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d 3d 53 41 56  LBACK || op==SAV
4910: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
4920: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
4930: 76 70 74 3e 3d 30 20 7c 7c 20 28 69 53 76 70 74  vpt>=0 || (iSvpt
4940: 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
4950: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
4960: 29 3b 0a 20 20 20 20 69 66 28 20 69 53 76 70 74  );.    if( iSvpt
4970: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 61 70  <0 ){.      pMap
4980: 2d 3e 6e 53 76 70 74 20 3d 20 30 3b 0a 20 20 20  ->nSvpt = 0;.   
4990: 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61     pMap->nRollba
49a0: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  ck = 0;.      me
49b0: 6d 73 65 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c  mset(pMap->aPtr,
49c0: 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29   0, sizeof(Pgno)
49d0: 20 2a 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c   * pMap->nPtrAll
49e0: 6f 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oc);.    }else i
49f0: 66 28 20 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e  f( iSvpt<pMap->n
4a00: 53 76 70 74 20 29 7b 0a 20 20 20 20 20 20 69 66  Svpt ){.      if
4a10: 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
4a20: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
4a30: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
4a40: 20 20 20 20 66 6f 72 28 69 69 3d 70 4d 61 70 2d      for(ii=pMap-
4a50: 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31 3b 20 69 69  >nRollback-1; ii
4a60: 3e 3d 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53  >=pMap->aSvpt[iS
4a70: 76 70 74 5d 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  vpt]; ii--){.   
4a80: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4a90: 6e 74 72 79 20 2a 70 20 3d 20 26 70 4d 61 70 2d  ntry *p = &pMap-
4aa0: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69 69 5d 3b 0a  >aRollback[ii];.
4ab0: 20 20 20 20 20 20 20 20 20 20 50 74 72 6d 61 70            Ptrmap
4ac0: 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20  Entry *pEntry = 
4ad0: 26 70 4d 61 70 2d 3e 61 50 74 72 5b 70 2d 3e 70  &pMap->aPtr[p->p
4ae0: 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72  gno - pMap->iFir
4af0: 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  st];.          p
4b00: 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 20 3d 20  Entry->parent = 
4b10: 70 2d 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20  p->parent;.     
4b20: 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 65 54 79       pEntry->eTy
4b30: 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20  pe = p->eType;. 
4b40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4b50: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76  .      pMap->nSv
4b60: 70 74 20 3d 20 69 53 76 70 74 20 2b 20 28 6f 70  pt = iSvpt + (op
4b70: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
4b80: 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 70 4d 61  BACK);.      pMa
4b90: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3d 20 70  p->nRollback = p
4ba0: 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53 76 70 74  Map->aSvpt[iSvpt
4bb0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ];.    }.  }.}..
4bc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4bd0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
4be0: 74 65 72 20 61 6e 20 55 4e 4c 4f 43 4b 45 44 20  ter an UNLOCKED 
4bf0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
4c00: 70 65 6e 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  pened on the.** 
4c10: 64 61 74 61 62 61 73 65 2e 20 49 74 20 61 6c 6c  database. It all
4c20: 6f 63 61 74 65 73 20 74 68 65 20 42 74 72 65 65  ocates the Btree
4c30: 50 74 72 6d 61 70 20 73 74 72 75 63 74 75 72 65  Ptrmap structure
4c40: 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 70   used to track p
4c50: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
4c60: 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20 61 6e  located pages an
4c70: 64 20 7a 65 72 6f 65 73 20 74 68 65 20 6e 46 72  d zeroes the nFr
4c80: 65 65 2f 69 54 72 75 6e 6b 20 66 69 65 6c 64 73  ee/iTrunk fields
4c90: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
4ca0: 20 0a 2a 2a 20 68 65 61 64 65 72 20 6f 6e 20 70   .** header on p
4cb0: 61 67 65 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  age 1..*/.static
4cc0: 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61 70   int btreePtrmap
4cd0: 41 6c 6c 6f 63 61 74 65 28 42 74 53 68 61 72 65  Allocate(BtShare
4ce0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
4cf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4d00: 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d   BtreePtrmap *pM
4d10: 61 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ap = sqlite3_mal
4d20: 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65  loc(sizeof(Btree
4d30: 50 74 72 6d 61 70 29 29 3b 0a 20 20 61 73 73 65  Ptrmap));.  asse
4d40: 72 74 28 20 70 42 74 2d 3e 70 4d 61 70 3d 3d 30  rt( pBt->pMap==0
4d50: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
4d60: 49 73 55 6e 6c 6f 63 6b 65 64 28 70 42 74 2d 3e  IsUnlocked(pBt->
4d70: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28  pPager) );.  if(
4d80: 20 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20   pMap==0 ){.    
4d90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4da0: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
4db0: 6d 65 6d 73 65 74 28 26 70 42 74 2d 3e 70 50 61  memset(&pBt->pPa
4dc0: 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
4dd0: 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 32  0, sizeof(u32)*2
4de0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4d  );.    memset(pM
4df0: 61 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 42 74  ap, 0, sizeof(Bt
4e00: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
4e10: 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20   pMap->iFirst = 
4e20: 70 42 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a  pBt->nPage + 1;.
4e30: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
4e40: 70 4d 61 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pMap;.  }.  retu
4e50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4e60: 46 72 65 65 20 61 6e 79 20 42 74 72 65 65 50 74  Free any BtreePt
4e70: 72 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 61  rmap structure a
4e80: 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  llocated by an e
4e90: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a  arlier call to.*
4ea0: 2a 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c  * btreePtrmapAll
4eb0: 6f 63 61 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ocate()..*/.stat
4ec0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72  ic void btreePtr
4ed0: 6d 61 70 44 65 6c 65 74 65 28 42 74 53 68 61 72  mapDelete(BtShar
4ee0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 72 65  ed *pBt){.  Btre
4ef0: 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20  ePtrmap *pMap = 
4f00: 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28  pBt->pMap;.  if(
4f10: 20 70 4d 61 70 20 29 7b 0a 20 20 20 20 73 71 6c   pMap ){.    sql
4f20: 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e  ite3_free(pMap->
4f30: 61 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  aRollback);.    
4f40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
4f50: 70 2d 3e 61 50 74 72 29 3b 0a 20 20 20 20 73 71  p->aPtr);.    sq
4f60: 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70 2d  lite3_free(pMap-
4f70: 3e 61 53 76 70 74 29 3b 0a 20 20 20 20 73 71 6c  >aSvpt);.    sql
4f80: 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70 29 3b  ite3_free(pMap);
4f90: 0a 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d  .    pBt->pMap =
4fa0: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   0;.  }.}.#else.
4fb0: 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74  # define btreePt
4fc0: 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 78 29 20  rmapAllocate(x) 
4fd0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
4fe0: 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 44 65  ne btreePtrmapDe
4ff0: 6c 65 74 65 28 78 29 20 0a 23 20 64 65 66 69 6e  lete(x) .# defin
5000: 65 20 62 74 72 65 65 50 74 72 6d 61 70 42 65 67  e btreePtrmapBeg
5010: 69 6e 28 78 2c 79 29 20 20 53 51 4c 49 54 45 5f  in(x,y)  SQLITE_
5020: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65  OK.# define btre
5030: 65 50 74 72 6d 61 70 45 6e 64 28 78 2c 79 2c 7a  ePtrmapEnd(x,y,z
5040: 29 20 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  ) .#endif..stati
5050: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
5060: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
5070: 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20  e);  /* Forward 
5080: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a  reference */../*
5090: 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .***** This rout
50a0: 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69  ine is used insi
50b0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f  de of assert() o
50c0: 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56  nly ****.**.** V
50d0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
50e0: 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20  ursor holds the 
50f0: 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53  mutex on its BtS
5100: 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20  hared.*/.#ifdef 
5110: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
5120: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f  tic int cursorHo
5130: 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f  ldsMutex(BtCurso
5140: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
5150: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5160: 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
5170: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
5180: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
5190: 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
51a0: 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70   of the cursor p
51b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
51c0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  st argument..** 
51d0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
51e0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
51f0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  t..*/.#define in
5200: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5210: 43 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75  Cache(pCur) (pCu
5220: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
5230: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a  BTCF_ValidOvfl).
5240: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
5250: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
5260: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
5270: 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  or all cursors o
5280: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  pened.** on the 
5290: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
52a0: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73  ucture pBt..*/.s
52b0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
52c0: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
52d0: 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a  Cache(BtShared *
52e0: 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
52f0: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5300: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5310: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
5320: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
5330: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5340: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c  Next){.    inval
5350: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5360: 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  he(p);.  }.}..#i
5370: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5380: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
5390: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
53a0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
53b0: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
53c0: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
53d0: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
53e0: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
53f0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
5400: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
5410: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
5420: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
5430: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
5440: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
5450: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
5460: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
5470: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
5480: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
5490: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
54a0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
54b0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
54c0: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
54d0: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
54e0: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
54f0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5500: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
5510: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
5520: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
5530: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
5540: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
5550: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
5560: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
5570: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
5580: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
5590: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
55a0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
55b0: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
55c0: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
55d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
55e0: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
55f0: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
5600: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
5610: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
5620: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
5630: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5650: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
5660: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
5670: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
5680: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
5690: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
56a0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
56b0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
56c0: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
56d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
56e0: 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72  obCur==0 ) retur
56f0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
5700: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
5710: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
5720: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
5730: 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66  blobCur = 0;.  f
5740: 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
5750: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
5760: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5770: 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  f( (p->curFlags 
5780: 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29  & BTCF_Incrblob)
5790: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
57a0: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
57b0: 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Cur = 1;.      i
57c0: 66 28 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  f( isClearTable 
57d0: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
57e0: 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  =iRow ){.       
57f0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
5800: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
5810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5820: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
5830: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
5840: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
5850: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
5860: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
5870: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
5880: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
5890: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
58a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
58b0: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
58c0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
58d0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
58e0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
58f0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
5900: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
5910: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
5920: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
5930: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
5940: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
5950: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
5960: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
5970: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
5980: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
5990: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
59a0: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
59b0: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
59c0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
59d0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
59e0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
59f0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
5a00: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
5a10: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
5a20: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
5a30: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
5a40: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
5a50: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
5a60: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
5a70: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
5a80: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
5a90: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
5aa0: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
5ab0: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
5ac0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
5ad0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
5ae0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
5af0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
5b00: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
5b10: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
5b20: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
5b30: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
5b40: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
5b50: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
5b60: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
5b70: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
5b80: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
5b90: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
5ba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
5bb0: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
5bc0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
5bd0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
5be0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
5bf0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
5c00: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
5c10: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
5c20: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
5c30: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
5c40: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
5c50: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
5c60: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
5c70: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
5c80: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
5c90: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
5ca0: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
5cb0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
5cc0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
5cd0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
5ce0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
5cf0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
5d00: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
5d10: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
5d20: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
5d30: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
5d40: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
5d50: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
5d60: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
5d70: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
5d80: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
5d90: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
5da0: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
5db0: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
5dc0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
5dd0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
5de0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
5df0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
5e00: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
5e10: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
5e20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
5e30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
5e40: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
5e50: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
5e60: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
5e70: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
5e80: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
5e90: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
5ea0: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
5eb0: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
5ec0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
5ed0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
5ee0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
5ef0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
5f00: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
5f10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5f20: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
5f30: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
5f40: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
5f50: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
5f60: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
5f70: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
5f80: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
5f90: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5fa0: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
5fb0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
5fc0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
5fd0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5fe0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
5ff0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6000: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6010: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
6020: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
6030: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
6040: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
6050: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
6060: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
6070: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
6080: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
60a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
60b0: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
60c0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
60d0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
60e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
60f0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6100: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6110: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6120: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6130: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6140: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6150: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6160: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6170: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6180: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6190: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
61a0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
61b0: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
61c0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
61d0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
61e0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
61f0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6200: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6210: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6220: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6230: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6240: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6250: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6260: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6270: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6280: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6290: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
62a0: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
62b0: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
62c0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
62d0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
62e0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
62f0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6300: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6310: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6320: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6330: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6340: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6350: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6360: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6370: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6380: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6390: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
63a0: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
63b0: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
63c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
63d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
63e0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
63f0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6400: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6410: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6420: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
6430: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
6440: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
6450: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
6460: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
6470: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
6480: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
6490: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
64a0: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
64b0: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
64c0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
64d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
64e0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
64f0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
6500: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
6510: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
6520: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
6530: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
6540: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
6550: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
6560: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
6570: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
6580: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
6590: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
65a0: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
65b0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
65c0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
65d0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
65e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
65f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6600: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
6610: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
6620: 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43  Cur->eState || C
6630: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d  URSOR_SKIPNEXT==
6640: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
6650: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
6660: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
6670: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
6680: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
6690: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
66a0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
66b0: 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  EXT ){.    pCur-
66c0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
66d0: 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b  _VALID;.  }else{
66e0: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
66f0: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
6700: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6710: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70  KeySize(pCur, &p
6720: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73  Cur->nKey);.  as
6730: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
6740: 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69  _OK );  /* KeySi
6750: 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ze() cannot fail
6760: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
6770: 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74  s is an intKey t
6780: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61  able, then the a
6790: 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72  bove call to Btr
67a0: 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a  eeKeySize().  **
67b0: 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65   stores the inte
67c0: 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d  ger key in pCur-
67d0: 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63  >nKey. In this c
67e0: 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ase this value i
67f0: 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20  s.  ** all that 
6800: 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  is required. Oth
6810: 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20  erwise, if pCur 
6820: 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61  is not open on a
6830: 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61  n intKey.  ** ta
6840: 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63  ble, then malloc
6850: 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73   space for and s
6860: 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e  tore the pCur->n
6870: 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79  Key bytes of key
6880: 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a   .  ** data..  *
6890: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d  /.  if( 0==pCur-
68a0: 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20  >curIntKey ){.  
68b0: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
68c0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
68d0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
68e0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
68f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6900: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
6910: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
6920: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
6930: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6940: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
6950: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
6960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6970: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6980: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
6990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
69b0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
69c0: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75  ssert( !pCur->cu
69d0: 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  rIntKey || !pCur
69e0: 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28  ->pKey );..  if(
69f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6a00: 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61  {.    btreeRelea
6a10: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
6a20: 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72  (pCur);.    pCur
6a30: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6a40: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20  R_REQUIRESEEK;. 
6a50: 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   }..  invalidate
6a60: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
6a70: 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
6a80: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
6a90: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
6aa0: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
6ab0: 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73  OINLINE saveCurs
6ac0: 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73  orsOnList(BtCurs
6ad0: 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f  or*,Pgno,BtCurso
6ae0: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  r*);../*.** Save
6af0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
6b00: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65  f all cursors (e
6b10: 78 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74  xcept pExcept) t
6b20: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a  hat are open on.
6b30: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  ** the table wit
6b40: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
6b50: 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20  t.  "Saving the 
6b60: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22  cursor position"
6b70: 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74   means that.** t
6b80: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  he location in t
6b90: 68 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65  he btree is reme
6ba0: 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61  mbered in such a
6bb0: 20 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e   way that it can
6bc0: 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63   be.** moved bac
6bd0: 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70  k to the same sp
6be0: 6f 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72  ot after the btr
6bf0: 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ee has been modi
6c00: 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  fied.  This.** r
6c10: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6c20: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
6c30: 73 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75  sor pExcept is u
6c40: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
6c50: 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20  e.** table, for 
6c60: 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65  example in Btree
6c70: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
6c80: 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a  eInsert()..**.**
6c90: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
6ca0: 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
6cb0: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
6cc0: 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
6cd0: 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  ch .** cursors s
6ce0: 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69 72  hould have their
6cf0: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
6d00: 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20 62 74  lag set.  The bt
6d10: 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72  reeCursor().** r
6d20: 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20  outine enforces 
6d30: 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73  that rule.  This
6d40: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65   routine only ne
6d50: 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  eds to be called
6d60: 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d   in.** the uncom
6d70: 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45  mon case when pE
6d80: 78 70 65 63 74 20 68 61 73 20 74 68 65 20 42 54  xpect has the BT
6d90: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6da0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   set..**.** If p
6db0: 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64  Expect!=NULL and
6dc0: 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72   if no other cur
6dd0: 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f  sors are found o
6de0: 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d  n the same root-
6df0: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  page,.** then th
6e00: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
6e10: 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20  flag on pExpect 
6e20: 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61  is cleared, to a
6e30: 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  void another.** 
6e40: 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74  pointless call t
6e50: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  o this routine..
6e60: 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  **.** Implementa
6e70: 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73  tion note:  This
6e80: 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20   routine merely 
6e90: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
6ea0: 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20   any cursors.** 
6eb0: 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64  need to be saved
6ec0: 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20  .  It calls out 
6ed0: 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  to saveCursorsOn
6ee0: 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75  List() in the (u
6ef0: 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74  nusual).** event
6f00: 20 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72   that cursors ar
6f10: 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69  e in need to bei
6f20: 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61  ng saved..*/.sta
6f30: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
6f40: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
6f50: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
6f60: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
6f70: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
6f80: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
6f90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6fa0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6fb0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
6fc0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
6fd0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
6fe0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
6ff0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
7000: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
7010: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
7020: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
7030: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65  ot==iRoot) ) bre
7040: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  ak;.  }.  if( p 
7050: 29 20 72 65 74 75 72 6e 20 73 61 76 65 43 75 72  ) return saveCur
7060: 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52  sorsOnList(p, iR
7070: 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20  oot, pExcept);. 
7080: 20 69 66 28 20 70 45 78 63 65 70 74 20 29 20 70   if( pExcept ) p
7090: 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73  Except->curFlags
70a0: 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70   &= ~BTCF_Multip
70b0: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
70c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
70d0: 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  is helper routin
70e0: 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73  e to saveAllCurs
70f0: 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61 63 74  ors does the act
7100: 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69  ual work of savi
7110: 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  ng.** the cursor
7120: 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20  s if and when a 
7130: 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20  cursor is found 
7140: 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65  that actually re
7150: 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a  quires saving..*
7160: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7170: 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72  e is that no cur
7180: 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20  sors need to be 
7190: 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72  saved, so this r
71a0: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f  outine is.** bro
71b0: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73  ken out from its
71c0: 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64   caller to avoid
71d0: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61   unnecessary sta
71e0: 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d  ck pointer movem
71f0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
7200: 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
7210: 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  NE saveCursorsOn
7220: 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72  List(.  BtCursor
7230: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *p,         /* 
7240: 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  The first cursor
7250: 20 74 68 61 74 20 6e 65 65 64 73 20 73 61 76 69   that needs savi
7260: 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ng */.  Pgno iRo
7270: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ot,          /* 
7280: 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72  Only save cursor
7290: 20 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74   with this iRoot
72a0: 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65  . Save all if ze
72b0: 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  ro */.  BtCursor
72c0: 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20   *pExcept    /* 
72d0: 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73  Do not save this
72e0: 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
72f0: 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  do{.    if( p!=p
7300: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
7310: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
7320: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
7330: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
7340: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7350: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
7360: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
7370: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
7380: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
7390: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
73a0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
73b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
73c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
73d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
73e0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
73f0: 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29  se( p->iPage>0 )
7400: 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52  ;.        btreeR
7410: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7420: 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d  ages(p);.      }
7430: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
7440: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c  ->pNext;.  }whil
7450: 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e  e( p );.  return
7460: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7470: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
7480: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
7490: 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  sition..*/.void 
74a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
74b0: 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  rCursor(BtCursor
74c0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
74d0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
74e0: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
74f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
7500: 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  ->pKey);.  pCur-
7510: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75  >pKey = 0;.  pCu
7520: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7530: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  OR_INVALID;.}../
7540: 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
7550: 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76  sion of BtreeMov
7560: 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70  eto, pKey is a p
7570: 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f  acked index reco
7580: 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73  rd.** such as is
7590: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
75a0: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
75b0: 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20  opcode.  Unpack 
75c0: 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e  the.** record an
75d0: 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65  d then call Btre
75e0: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
75f0: 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  ) to do the work
7600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7610: 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42  btreeMoveto(.  B
7620: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
7630: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
7640: 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74  n on the btree t
7650: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
7660: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
7670: 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64  Key,   /* Packed
7680: 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65   key if the btre
7690: 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  e is an index */
76a0: 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  .  i64 nKey,    
76b0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
76c0: 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  r key for tables
76d0: 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20  .  Size of pKey 
76e0: 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  for indices */. 
76f0: 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20   int bias,      
7700: 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61       /* Bias sea
7710: 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
7720: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
7730: 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  es           /* 
7740: 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
7750: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
7760: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7780: 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20  Status code */. 
7790: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
77a0: 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55  *pIdxKey;   /* U
77b0: 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
77c0: 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61  y */.  char aSpa
77d0: 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20  ce[200];        
77e0: 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20    /* Temp space 
77f0: 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f  for pIdxKey - to
7800: 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20   avoid a malloc 
7810: 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65  */.  char *pFree
7820: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65   = 0;..  if( pKe
7830: 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
7840: 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74   nKey==(i64)(int
7850: 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64  )nKey );.    pId
7860: 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
7870: 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
7880: 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70  ecord(.        p
7890: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61  Cur->pKeyInfo, a
78a0: 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
78b0: 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20  pace), &pFree.  
78c0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64    );.    if( pId
78d0: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
78e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
78f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
7900: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
7910: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
7920: 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78  nKey, pKey, pIdx
7930: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  Key);.    if( pI
7940: 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30  dxKey->nField==0
7950: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7960: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
7970: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
7980: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
7990: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
79a0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BKPT;.    }.  }e
79b0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
79c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
79d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
79e0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
79f0: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
7a00: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
7a10: 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
7a20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
7a30: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
7a40: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  b, pFree);.  }. 
7a50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7a60: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
7a70: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
7a80: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
7a90: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
7aa0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
7ab0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
7ac0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
7ad0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
7ae0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
7af0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
7b00: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
7b10: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
7b20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
7b30: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
7b40: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
7b50: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
7b60: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7b70: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
7b80: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
7b90: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
7ba0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
7bb0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
7bc0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
7bd0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
7be0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
7bf0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
7c00: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
7c10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7c20: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
7c30: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
7c40: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7c50: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
7c60: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
7c70: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
7c80: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
7c90: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
7ca0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  LID;.  rc = btre
7cb0: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
7cc0: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
7cd0: 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65  nKey, 0, &skipNe
7ce0: 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  xt);.  if( rc==S
7cf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7d00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
7d10: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
7d20: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
7d30: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7d40: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7d50: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
7d60: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
7d70: 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72  ALID );.    pCur
7d80: 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b  ->skipNext |= sk
7d90: 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ipNext;.    if( 
7da0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26  pCur->skipNext &
7db0: 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
7dc0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
7dd0: 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
7de0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50  te = CURSOR_SKIP
7df0: 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NEXT;.    }.  }.
7e00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7e10: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43  #define restoreC
7e20: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
7e30: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e   \.  (p->eState>
7e40: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
7e50: 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20  EEK ? \.        
7e60: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
7e70: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
7e80: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
7e90: 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  TE_OK)../*.** De
7ea0: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
7eb0: 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20  or not a cursor 
7ec0: 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74  has moved from t
7ed0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72  he position wher
7ee0: 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74  e.** it was last
7ef0: 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20   placed, or has 
7f00: 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64  been invalidated
7f10: 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72   for any other r
7f20: 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72  eason..** Cursor
7f30: 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20  s can move when 
7f40: 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65  the row they are
7f50: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20   pointing at is 
7f60: 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66  deleted out.** f
7f70: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20  rom under them, 
7f80: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75  for example.  Cu
7f90: 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  rsor might also 
7fa0: 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65 65 0a  move if a btree.
7fb0: 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64  ** is rebalanced
7fc0: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
7fd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
7fe0: 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20  h a NULL cursor 
7ff0: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20  pointer returns 
8000: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  false..**.** Use
8010: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 73 71   the separate sq
8020: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
8030: 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e  Restore() routin
8040: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63  e to restore a c
8050: 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f  ursor.** back to
8060: 20 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 20   where it ought 
8070: 74 6f 20 62 65 20 69 66 20 74 68 69 73 20 72 6f  to be if this ro
8080: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72  utine returns tr
8090: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
80a0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
80b0: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
80c0: 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
80d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
80e0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
80f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8100: 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72  e restores a cur
8110: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
8120: 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f  original positio
8130: 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61  n after it.** ha
8140: 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20  s been moved by 
8150: 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74  some outside act
8160: 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61  ivity (such as a
8170: 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65   btree rebalance
8180: 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76   or.** a row hav
8190: 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ing been deleted
81a0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
81b0: 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a  the cursor).  .*
81c0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
81d0: 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74   the *pDifferent
81e0: 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73  Row parameter is
81f0: 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75   false if the cu
8200: 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20  rsor is left.** 
8210: 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63  pointing at exac
8220: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77  tly the same row
8230: 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77  .  *pDifferntRow
8240: 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20   is the row the 
8250: 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f  cursor.** was po
8260: 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65  inting to has be
8270: 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63  en deleted, forc
8280: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
8290: 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a  o point to some.
82a0: 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a  ** nearby row..*
82b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
82c0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
82d0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75   called for a cu
82e0: 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72  rsor that just r
82f0: 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20  eturned.** TRUE 
8300: 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
8310: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
8320: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
8330: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
8340: 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ore(BtCursor *pC
8350: 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72  ur, int *pDiffer
8360: 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72  entRow){.  int r
8370: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  c;..  assert( pC
8380: 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ur!=0 );.  asser
8390: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  t( pCur->eState!
83a0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
83b0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
83c0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
83d0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
83e0: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
83f0: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
8400: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
8410: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
8420: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
8430: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
8440: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
8450: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
8460: 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29  r->skipNext==0 )
8470: 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  ;.    *pDifferen
8480: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tRow = 0;.  }.  
8490: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
84a0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
84b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
84c0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
84d0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
84e0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
84f0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
8500: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
8510: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
8520: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
8530: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
8540: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
8550: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
8560: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
8570: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
8580: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
8590: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
85a0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
85b0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
85c0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
85d0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
85e0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
85f0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
8600: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
8610: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
8620: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8630: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8640: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8650: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8660: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8670: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8680: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8690: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
86a0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
86b0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
86c0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
86d0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
86e0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
86f0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
8700: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
8710: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
8720: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8730: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8740: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8750: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8770: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8780: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8790: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
87a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
87b0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
87c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
87d0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
87e0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
87f0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
8800: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
8810: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8820: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8830: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8840: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8850: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8860: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8870: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8880: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8890: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
88a0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
88b0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
88c0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
88d0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
88e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
88f0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
8900: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
8910: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
8920: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8930: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8940: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8950: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8960: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8970: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8980: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8990: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
89a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
89b0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
89c0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
89d0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
89e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
89f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8a00: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
8a10: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
8a20: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8a30: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8a40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8a50: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8a60: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8a70: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8a80: 62 65 72 20 69 73 20 6e 65 76 65 72 20 61 64 64  ber is never add
8a90: 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  ed to a pointer-
8aa0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
8ab0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
8ac0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
8ad0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8ae0: 74 29 29 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  t)) );..#ifdef S
8af0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
8b00: 4f 43 4b 45 44 0a 20 20 69 66 28 20 70 42 74 2d  OCKED.  if( pBt-
8b10: 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70 52  >pMap ){.    *pR
8b20: 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 53  C = btreePtrmapS
8b30: 74 6f 72 65 28 70 42 74 2c 20 6b 65 79 2c 20 65  tore(pBt, key, e
8b40: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a 20  Type, parent);. 
8b50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8b60: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
8b70: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
8b80: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
8b90: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
8ba0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8bb0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
8bc0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
8bd0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
8be0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
8bf0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
8c00: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
8c10: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
8c20: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8c30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
8c40: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
8c50: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
8c60: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
8c70: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
8c80: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
8c90: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
8ca0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8cb0: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
8cc0: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
8cd0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
8ce0: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
8cf0: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50  leSize-5 );.  pP
8d00: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
8d10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8d20: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
8d30: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
8d40: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
8d50: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
8d60: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
8d70: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
8d80: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
8d90: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
8da0: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
8db0: 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20  nt));.    *pRC= 
8dc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8dd0: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
8de0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8df0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8e00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
8e10: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
8e20: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
8e30: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
8e40: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
8e50: 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73  ptrmap_exit:.  s
8e60: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
8e70: 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  (pDbPage);.}../*
8e80: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
8e90: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
8ea0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
8eb0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
8ec0: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
8ed0: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
8ee0: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
8ef0: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
8f00: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
8f10: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
8f20: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
8f30: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
8f40: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
8f50: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
8f60: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
8f70: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
8f80: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
8f90: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
8fa0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
8fb0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
8fc0: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
8fd0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
8fe0: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
8ff0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
9000: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
9010: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9020: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
9030: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
9040: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9050: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
9060: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
9070: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9080: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
9090: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
90a0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
90b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
90c0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
90d0: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
90e0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
90f0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
9100: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
9110: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
9120: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
9130: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
9140: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
9150: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
9160: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
9170: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
9180: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
9190: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
91a0: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
91b0: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
91c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
91d0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
91e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
91f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9200: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9210: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
9220: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
9230: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
9240: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
9250: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
9260: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
9270: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
9280: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
9290: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
92a0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
92b0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
92c0: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
92d0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
92e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
92f0: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
9300: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
9310: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
9320: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
9330: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
9340: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
9350: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
9360: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
9370: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
9380: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
9390: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
93a0: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
93b0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
93c0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
93d0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
93e0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
93f0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
9400: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
9410: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
9420: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
9430: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9440: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
9450: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
9460: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
9470: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
9480: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
9490: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
94a0: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
94b0: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
94c0: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
94d0: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
94e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
94f0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
9500: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
9510: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
9520: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
9530: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
9540: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
9550: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
9560: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
9570: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
9580: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
9590: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
95a0: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
95b0: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
95c0: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
95d0: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
95e0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
95f0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
9600: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
9610: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
9620: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
9630: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
9640: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9650: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
9660: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
9670: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
9680: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
9690: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
96a0: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
96b0: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
96c0: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
96d0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
96e0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
96f0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
9700: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
9710: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
9720: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
9730: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9740: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9750: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9760: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9770: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9780: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9790: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
97a0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
97b0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
97c0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
97d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
97e0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
97f0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
9800: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
9810: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
9820: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
9830: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9840: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9850: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9860: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9870: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9880: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9890: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
98a0: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
98b0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
98c0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
98d0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
98e0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
98f0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
9900: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
9910: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
9920: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
9930: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9940: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9950: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9960: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9970: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9980: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9990: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
99a0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
99b0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
99c0: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
99d0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
99e0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
99f0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
9a00: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9a10: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
9a20: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9a30: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9a40: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9a50: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9a60: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9a70: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9a80: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9a90: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9aa0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
9ab0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
9ac0: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
9ad0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
9ae0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
9af0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
9b00: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9b10: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
9b20: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
9b30: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9b40: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9b50: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9b60: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9b70: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9b80: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9b90: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 69  ;.  }.  pInfo->i
9ba0: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
9bb0: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
9bc0: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
9bd0: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 70 49 6e   - pCell);.  pIn
9be0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
9bf0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
9c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
9c10: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9c20: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
9c30: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
9c40: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
9c50: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
9c60: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
9c70: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
9c80: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
9c90: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
9ca0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
9cb0: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
9cc0: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
9cd0: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
9ce0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
9cf0: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
9d00: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
9d10: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
9d20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
9d30: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
9d40: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
9d50: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
9d60: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
9d70: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
9d80: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
9d90: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
9da0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
9db0: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
9dc0: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
9dd0: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
9de0: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
9df0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
9e00: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
9e10: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
9e20: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9e30: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9e40: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9e50: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9e80: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
9e90: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9ea0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9eb0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9ec0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
9ed0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9ee0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9ef0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9f00: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9f10: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9f20: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
9f30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9f40: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9f50: 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20  e==4 );.#ifndef 
9f60: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
9f70: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9f80: 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pPage);.#endif. 
9f90: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9fa0: 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70  4 + getVarint(&p
9fb0: 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26  Cell[4], (u64*)&
9fc0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
9fd0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9fe0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c  = 0;.  pInfo->nL
9ff0: 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66  ocal = 0;.  pInf
a000: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30  o->iOverflow = 0
a010: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a020: 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  oad = 0;.  retur
a030: 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  n;.}.static void
a040: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
a050: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
a060: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
a070: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
a080: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
a090: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
a0a0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
a0b0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
a0c0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
a0d0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
a0e0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
a0f0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
a100: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
a110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
a120: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
a130: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
a140: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
a150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a160: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
a170: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36   payload */.  u6
a180: 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20  4 iKey;         
a190: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
a1a0: 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  ed Key value */.
a1b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a1c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
a1d0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
a1e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a1f0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
a200: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
a210: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a220: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 7c 7c  e->intKeyLeaf ||
a230: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
a240: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
a250: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d  Page->noPayload=
a260: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a270: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
a280: 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  f );.  assert( p
a290: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a2a0: 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  ze==0 );.  pIter
a2b0: 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20   = pCell;..  /* 
a2c0: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
a2d0: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
a2e0: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
a2f0: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
a300: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
a310: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
a320: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
a330: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
a340: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
a350: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61  call..  */.  nPa
a360: 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a  yload = *pIter;.
a370: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d    if( nPayload>=
a380: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
a390: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
a3a0: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26  ;.    nPayload &
a3b0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
a3c0: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
a3d0: 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c   (nPayload<<7) |
a3e0: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
a3f0: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
a400: 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  (*pIter)>=0x80 &
a410: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a420: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a    }.  pIter++;..
a430: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c    /* The next bl
a440: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65  ock of code is e
a450: 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20  quivalent to:.  
a460: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65  **.  **     pIte
a470: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70  r += getVarint(p
a480: 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e  Iter, (u64*)&pIn
a490: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a  fo->nKey);.  **.
a4a0: 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73    ** The code is
a4b0: 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69   inlined to avoi
a4c0: 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  d a function cal
a4d0: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d  l..  */.  iKey =
a4e0: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69   *pIter;.  if( i
a4f0: 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  Key>=0x80 ){.   
a500: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
a510: 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20  er[7];.    iKey 
a520: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69  &= 0x7f;.    whi
a530: 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65  le(1){.      iKe
a540: 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20  y = (iKey<<7) | 
a550: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
a560: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70  );.      if( (*p
a570: 49 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65  Iter)<0x80 ) bre
a580: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ak;.      if( pI
a590: 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20  ter>=pEnd ){.   
a5a0: 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65       iKey = (iKe
a5b0: 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72  y<<8) | *++pIter
a5c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a5d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a5e0: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
a5f0: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a   pInfo->nKey = *
a600: 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70  (i64*)&iKey;.  p
a610: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
a620: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
a630: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
a640: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
a650: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a660: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a670: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
a680: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
a690: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a6a0: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
a6b0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a6c0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
a6d0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
a6e0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
a6f0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
a700: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
a710: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
a720: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
a730: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
a740: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
a750: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
a760: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a770: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
a780: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
a790: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
a7a0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
a7b0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
a7c0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
a7d0: 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
a7e0: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a7f0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a800: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a810: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a820: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a830: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
a840: 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61  trIndex(.  MemPa
a850: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a860: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a870: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a880: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
a890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a8a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
a8b0: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
a8c0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
a8d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a8e0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
a8f0: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  */.){.  u8 *pIte
a900: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
a910: 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20  /* For scanning 
a920: 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f  through pCell */
a930: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
a940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a950: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
a960: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
a970: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a980: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a990: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a9a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
a9b0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
a9c0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
a9d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a9e0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  ge->intKeyLeaf==
a9f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
aa00: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d  Page->noPayload=
aa10: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
aa20: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
aa30: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
aa40: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
aa50: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
aa60: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
aa70: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
aa80: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
aa90: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
aaa0: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
aab0: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
aac0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
aad0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
aae0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
aaf0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
ab00: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
ab10: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
ab20: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
ab30: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
ab40: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
ab50: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
ab60: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
ab70: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
ab80: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
ab90: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
aba0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
abb0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
abc0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
abd0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
abe0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
abf0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
ac00: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
ac10: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
ac20: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
ac30: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
ac40: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
ac50: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
ac60: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
ac70: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
ac80: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
ac90: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
aca0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
acb0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
acc0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
acd0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
ace0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
acf0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
ad00: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
ad10: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
ad20: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
ad30: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
ad40: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
ad50: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20  treeParseCell(. 
ad60: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
ad70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
ad80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
ad90: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
ada0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
adb0: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
adc0: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
add0: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
ade0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
adf0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
ae00: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
ae10: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  ){.  pPage->xPar
ae20: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69  seCell(pPage, fi
ae30: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
ae40: 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  ell), pInfo);.}.
ae50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
ae60: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
ae70: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
ae80: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
ae90: 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65  .xCellSize.** me
aea0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  thod..**.** Comp
aeb0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
aec0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
aed0: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
aee0: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
aef0: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
af00: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
af10: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
af20: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
af30: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
af40: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
af50: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
af60: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
af70: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
af80: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
af90: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  l pointer..**.**
afa0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
afb0: 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20  yload()    =>   
afc0: 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e  table internal n
afd0: 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  odes.** cellSize
afe0: 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20  Ptr()           
aff0: 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78    =>   all index
b000: 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c   nodes & table l
b010: 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61  eaf nodes.*/.sta
b020: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
b030: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
b040: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
b050: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43    u8 *pIter = pC
b060: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
b070: 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f  ldPtrSize; /* Fo
b080: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
b090: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
b0a0: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
b0d0: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
b0e0: 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53  rint */.  u32 nS
b0f0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65     /* Size value
b120: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23   to return */..#
b130: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
b140: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
b150: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
b160: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
b170: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
b180: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
b190: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
b1a0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
b1b0: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
b1c0: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
b1d0: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
b1e0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
b1f0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
b200: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
b210: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
b220: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
b230: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
b240: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
b250: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
b260: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
b270: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
b280: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
b290: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
b2a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b2b0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29  ->noPayload==0 )
b2c0: 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74  ;.  nSize = *pIt
b2d0: 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e  er;.  if( nSize>
b2e0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e  =0x80 ){.    pEn
b2f0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
b300: 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66     nSize &= 0x7f
b310: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
b320: 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c  nSize = (nSize<<
b330: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
b340: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
b350: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
b360: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
b370: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
b380: 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  +;.  if( pPage->
b390: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
b3a0: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
b3b0: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
b3c0: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
b3d0: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
b3e0: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
b3f0: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
b400: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
b410: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
b420: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
b430: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
b440: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
b450: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
b460: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
b470: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
b480: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
b490: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
b4a0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
b4b0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
b4c0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
b4d0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
b4e0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
b4f0: 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65  if( nSize<=pPage
b500: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
b510: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
b520: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b530: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
b540: 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20   ) nSize = 4;.  
b550: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
b560: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
b570: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
b580: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
b590: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
b5a0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
b5b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
b5c0: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
b5d0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
b5e0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
b5f0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
b600: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
b610: 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
b620: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
b630: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53  ocal ){.      nS
b640: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  ize = minLocal;.
b650: 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20      }.    nSize 
b660: 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74  += 4 + (u16)(pIt
b670: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d  er - pCell);.  }
b680: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
b690: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
b6a0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
b6b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
b6c0: 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63  )nSize;.}.static
b6d0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
b6e0: 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67  NoPayload(MemPag
b6f0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
b700: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
b710: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f  r = pCell + 4; /
b720: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
b730: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
b740: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b760: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
b770: 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  varint */..#ifde
b780: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b790: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
b7a0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
b7b0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
b7c0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
b7d0: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
b7e0: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
b7f0: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
b800: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
b810: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
b820: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
b830: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
b840: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
b850: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
b860: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
b870: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
b880: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
b890: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
b8a0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
b8b0: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
b8c0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
b8d0: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
b8e0: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  fo);.#else.  UNU
b8f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
b900: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  age);.#endif..  
b910: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
b920: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
b930: 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72  ;.  pEnd = pIter
b940: 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 9;.  while( (
b950: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
b960: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
b970: 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69    assert( debugi
b980: 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29  nfo.nSize==(u16)
b990: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20  (pIter - pCell) 
b9a0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
b9b0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28  .  return (u16)(
b9c0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
b9d0: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
b9e0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
b9f0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
ba00: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
ba10: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
ba20: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
ba30: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
ba40: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
ba50: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ba60: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
ba70: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65  eturn pPage->xCe
ba80: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69  llSize(pPage, fi
ba90: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
baa0: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
bab0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bac0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
bad0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
bae0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
baf0: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
bb00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
bb10: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
bb20: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
bb30: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
bb40: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
bb50: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
bb60: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
bb70: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
bb80: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
bb90: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
bba0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
bbb0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
bbc0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
bbd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
bbe0: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
bbf0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
bc00: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
bc10: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
bc20: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67  erflow ){.    Pg
bc30: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
bc40: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
bc50: 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
bc60: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
bc70: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
bc80: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
bc90: 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b  age->pgno, pRC);
bca0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
bcb0: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
bcc0: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
bcd0: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
bce0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
bcf0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
bd00: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
bd10: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
bd20: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
bd30: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
bd40: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
bd50: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
bd60: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
bd70: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
bd80: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
bd90: 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46  *.** EVIDENCE-OF
bda0: 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20  : R-44582-60138 
bdb0: 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20  SQLite may from 
bdc0: 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f  time to time reo
bdd0: 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74  rganize a.** b-t
bde0: 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74  ree page so that
bdf0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
be00: 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67  eeblocks or frag
be10: 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a  ment bytes, all.
be20: 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  ** unused bytes 
be30: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
be40: 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64   the unallocated
be50: 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61   space region, a
be60: 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  nd all.** cells 
be70: 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74  are packed tight
be80: 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ly at the end of
be90: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
bea0: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
beb0: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
bec0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
bed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bee0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bef0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
bf00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bf10: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
bf20: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
bf30: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
bf60: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
bf70: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bf90: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
bfa0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
bfb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
bfc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bfd0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bfe0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bff0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
c000: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
c010: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
c020: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
c030: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
c040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
c050: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
c060: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
c070: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
c080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c090: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
c0a0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
c0b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
c0c0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
c0d0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
c0e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c0f0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
c100: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
c110: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
c120: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
c130: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
c140: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
c150: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
c160: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
c170: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
c180: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
c190: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1b0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
c1c0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20  ll index */...  
c1d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c1e0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c1f0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c200: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c210: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
c220: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c230: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
c240: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
c250: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
c260: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
c270: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
c280: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c290: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c2a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c2b0: 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20  temp = 0;.  src 
c2c0: 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  = data = pPage->
c2d0: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
c2e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c2f0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
c300: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c310: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
c320: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
c330: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
c340: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
c350: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
c360: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
c370: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
c380: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
c390: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
c3a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
c3b0: 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61  nCell;.  iCellLa
c3c0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
c3d0: 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  - 4;.  for(i=0; 
c3e0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
c3f0: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
c400: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
c410: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
c420: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
c430: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
c440: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
c450: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
c460: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
c470: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
c480: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
c490: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
c4a0: 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69  /* These conditi
c4b0: 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ons have already
c4c0: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69   been verified i
c4d0: 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  n btreeInitPage(
c4e0: 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47  ).    ** if PRAG
c4f0: 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65  MA cell_size_che
c500: 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ck=ON..    */.  
c510: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
c520: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
c530: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
c540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c550: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
c560: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
c570: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
c580: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c590: 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e    size = pPage->
c5a0: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
c5b0: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
c5c0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
c5d0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
c5e0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
c5f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c600: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c610: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c620: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
c630: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
c640: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
c650: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c660: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62      testcase( cb
c670: 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  rk+size==usableS
c680: 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ize );.    testc
c690: 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73  ase( pc+size==us
c6a0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
c6b0: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
c6c0: 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74  cbrk);.    if( t
c6d0: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
c6e0: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28  int x;.      if(
c6f0: 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74   cbrk==pc ) cont
c700: 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70  inue;.      temp
c710: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
c720: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
c730: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
c740: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
c750: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c760: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65        memcpy(&te
c770: 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c  mp[x], &data[x],
c780: 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78   (cbrk+size) - x
c790: 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74  );.      src = t
c7a0: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  emp;.    }.    m
c7b0: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
c7c0: 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a  ], &src[pc], siz
c7d0: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
c7e0: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
c7f0: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
c800: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
c810: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
c820: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
c830: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
c840: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
c850: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
c860: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
c870: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
c880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c890: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
c8a0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
c8b0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
c8c0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
c8d0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
c8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c8f0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
c900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c910: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  OK;.}../*.** Sea
c920: 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rch the free-lis
c930: 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f  t on page pPg fo
c940: 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65  r space to store
c950: 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79   a cell nByte by
c960: 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20  tes in.** size. 
c970: 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f  If one can be fo
c980: 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  und, return a po
c990: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61  inter to the spa
c9a0: 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  ce and remove it
c9b0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65  .** from the fre
c9c0: 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  e-list..**.** If
c9d0: 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61   no suitable spa
c9e0: 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  ce can be found 
c9f0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
ca00: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
ca10: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ca20: 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f  on may detect co
ca30: 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20  rruption within 
ca40: 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74  pPg.  If corrupt
ca50: 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74  ion is.** detect
ca60: 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20  ed then *pRc is 
ca70: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f  set to SQLITE_CO
ca80: 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69  RRUPT and NULL i
ca90: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
caa0: 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66  * Slots on the f
cab0: 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61 72  ree list that ar
cac0: 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  e between 1 and 
cad0: 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20 74  3 bytes larger t
cae0: 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c  han nByte.** wil
caf0: 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20  l be ignored if 
cb00: 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72 61  adding the extra
cb10: 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66 72   space to the fr
cb20: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
cb30: 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20  t.** causes the 
cb40: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
cb50: 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36 30  unt to exceed 60
cb60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
cb70: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d  pageFindSlot(Mem
cb80: 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e  Page *pPg, int n
cb90: 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b  Byte, int *pRc){
cba0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
cbb0: 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65   = pPg->hdrOffse
cbc0: 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  t;.  u8 * const 
cbd0: 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
cbe0: 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20  ta;.  int iAddr 
cbf0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74  = hdr + 1;.  int
cc00: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
cc10: 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20  aData[iAddr]);. 
cc20: 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73   int x;.  int us
cc30: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ableSize = pPg->
cc40: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
cc50: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30  ..  assert( pc>0
cc60: 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e   );.  do{.    in
cc70: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
cc80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
cc90: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
cca0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
ccb0: 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35  F: R-06866-39125
ccc0: 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   Freeblocks are 
ccd0: 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64  always connected
cce0: 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20   in order of.   
ccf0: 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f   ** increasing o
cd00: 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ffset. */.    if
cd10: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
cd20: 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20  4 || pc<iAddr+4 
cd30: 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
cd40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
cd50: 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
cd60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  n 0;.    }.    /
cd70: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
cd80: 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65  -22710-53328 The
cd90: 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74   third and fourt
cda0: 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a  h bytes of each.
cdb0: 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b      ** freeblock
cdc0: 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69   form a big-endi
cdd0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
cde0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
cdf0: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20  the freeblock.  
ce00: 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69    ** in bytes, i
ce10: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62  ncluding the 4-b
ce20: 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  yte header. */. 
ce30: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
ce40: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29  te(&aData[pc+2])
ce50: 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73  ;.    if( (x = s
ce60: 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20  ize - nByte)>=0 
ce70: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
ce80: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
ce90: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
cea0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 20  );.      if( pc 
ceb0: 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65  < pPg->cellOffse
cec0: 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c  t+2*pPg->nCell |
ced0: 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62  | size+pc > usab
cee0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
cef0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
cf00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
cf10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
cf20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cf30: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  x<4 ){.        /
cf40: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
cf50: 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20  -11498-58022 In 
cf60: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
cf70: 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74  tree page, the t
cf80: 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  otal.        ** 
cf90: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
cfa0: 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79  in fragments may
cfb0: 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20   not exceed 60. 
cfc0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  */.        if( a
cfd0: 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29  Data[hdr+7]>57 )
cfe0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
cff0: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
d000: 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20  e slot from the 
d010: 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74  free-list. Updat
d020: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  e the number of.
d030: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
d040: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
d050: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
d060: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
d070: 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61  aData[iAddr], &a
d080: 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  Data[pc], 2);.  
d090: 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b        aData[hdr+
d0a0: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
d0b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d0c0: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
d0d0: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
d0e0: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
d0f0: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
d100: 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  nt.         ** f
d110: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
d120: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
d130: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
d140: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
d150: 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  aData[pc+2], x);
d160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
d170: 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20  eturn &aData[pc 
d180: 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + x];.    }.    
d190: 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20  iAddr = pc;.    
d1a0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
d1b0: 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68  Data[pc]);.  }wh
d1c0: 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72 65  ile( pc );..  re
d1d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d1e0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
d1f0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
d200: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
d210: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
d220: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
d230: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
d240: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
d250: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
d260: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
d270: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
d280: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
d290: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
d2a0: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
d2b0: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
d2c0: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
d2d0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
d2e0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
d2f0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
d300: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
d310: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
d320: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
d330: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
d340: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
d350: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
d360: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
d370: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
d380: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
d390: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
d3a0: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
d3b0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
d3c0: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
d3d0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
d3e0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
d3f0: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
d400: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
d410: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
d420: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
d430: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
d440: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
d450: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
d460: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
d470: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
d480: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
d490: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
d4a0: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
d4b0: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
d4c0: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
d4d0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d4e0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d4f0: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
d500: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
d510: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
d520: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
d530: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
d540: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d570: 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  te of cell conte
d580: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
d590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74    /* Integer ret
d5c0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
d5d0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
d5e0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
d5f0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
d600: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
d610: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a  l content */.  .
d620: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d630: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
d640: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
d650: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d660: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
d670: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d680: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d690: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d6a0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
d6b0: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
d6c0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
d6d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d6e0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
d6f0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
d700: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
d710: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d720: 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50  nByte < (int)(pP
d730: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d740: 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73  Size-8) );..  as
d750: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c  sert( pPage->cel
d760: 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b  lOffset == hdr +
d770: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
d780: 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70  eaf );.  gap = p
d790: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
d7a0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
d7b0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70  l;.  assert( gap
d7c0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20  <=65536 );.  /* 
d7d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
d7e0: 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68  9356-02391 If th
d7f0: 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20  e database uses 
d800: 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67  a 65536-byte pag
d810: 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20  e size.  ** and 
d820: 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61  the reserved spa
d830: 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20  ce is zero (the 
d840: 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  usual value for 
d850: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a  reserved space).
d860: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65    ** then the ce
d870: 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65  ll content offse
d880: 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61  t of an empty pa
d890: 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36  ge wants to be 6
d8a0: 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76  5536..  ** Howev
d8b0: 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72  er, that integer
d8c0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f   is too large to
d8d0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20   be stored in a 
d8e0: 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  2-byte unsigned.
d8f0: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f    ** integer, so
d900: 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73   a value of 0 is
d910: 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61   used in its pla
d920: 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ce. */.  top = g
d930: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
d940: 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  r+5]);.  assert(
d950: 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65   top<=(int)pPage
d960: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d970: 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20  e ); /* Prevent 
d980: 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  by getAndInitPag
d990: 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70  e() */.  if( gap
d9a0: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  >top ){.    if( 
d9b0: 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d  top==0 && pPage-
d9c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d9d0: 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20  ==65536 ){.     
d9e0: 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20   top = 65536;.  
d9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
da00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
da10: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
da20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
da30: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
da40: 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20  ace between gap 
da50: 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20  and top for one 
da60: 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65  more cell pointe
da70: 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74  r.  ** array ent
da80: 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69  ry offset, and i
da90: 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  f the freelist i
daa0: 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65  s not empty, the
dab0: 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a  n search the.  *
dac0: 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  * freelist looki
dad0: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
dae0: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
daf0: 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71   satisfy the req
db00: 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  uest..  */.  tes
db10: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
db20: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
db30: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
db40: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
db50: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61  top );.  if( (da
db60: 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74  ta[hdr+2] || dat
db70: 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70  a[hdr+1]) && gap
db80: 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75  +2<=top ){.    u
db90: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
dba0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
dbb0: 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20  nByte, &rc);.   
dbc0: 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20   if( pSpace ){. 
dbd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70       assert( pSp
dbe0: 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53  ace>=data && (pS
dbf0: 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35  pace - data)<655
dc00: 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64  36 );.      *pId
dc10: 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65  x = (int)(pSpace
dc20: 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20   - data);.      
dc30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dc40: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
dc50: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
dc60: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
dc70: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
dc80: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
dc90: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
dca0: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
dcb0: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
dcc0: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
dcd0: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
dce0: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
dcf0: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
dd00: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
dd10: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
dd20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
dd30: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
dd40: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
dd50: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
dd60: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
dd70: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
dd80: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
dd90: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
dda0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
ddb0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
ddc0: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
ddd0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
dde0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
ddf0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
de00: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
de10: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
de20: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
de30: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
de40: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
de50: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
de60: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
de70: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
de80: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
de90: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
dea0: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
deb0: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
dec0: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
ded0: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
dee0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
def0: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
df00: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
df10: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
df20: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
df30: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
df40: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
df50: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
df60: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
df70: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
df80: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
df90: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
dfa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dfb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
dfc0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
dfd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
dfe0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
dff0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
e000: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
e010: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
e020: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
e030: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
e040: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
e050: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
e060: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
e070: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
e080: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
e090: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
e0a0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
e0b0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
e0c0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
e0d0: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
e0e0: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
e0f0: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
e100: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
e110: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
e120: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
e130: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
e140: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
e150: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
e160: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
e170: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
e180: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
e190: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
e1a0: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
e1b0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
e1c0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
e1d0: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
e1e0: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
e1f0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
e200: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
e210: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
e220: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
e230: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e260: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
e270: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
e280: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
e290: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e2b0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
e2c0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
e2d0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
e300: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
e310: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
e320: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
e350: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
e360: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
e370: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
e380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
e390: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
e3a0: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69  iSize */.  u32 i
e3b0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
e3c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b  t->usableSize-4;
e3d0: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
e3e0: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
e3f0: 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69  ffset */.  u32 i
e400: 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
e410: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
e420: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
e430: 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62  ast the iStart b
e440: 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  uffer */.  unsig
e450: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
e460: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
e470: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74   /* Page content
e480: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
e490: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
e4a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e4b0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
e4c0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
e4d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
e4e0: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74  ORRUPT_DB || iSt
e4f0: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
e500: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
e510: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
e520: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
e530: 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70  _DB || iEnd <= p
e540: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e550: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
e560: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e570: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
e580: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
e590: 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29  sert( iSize>=4 )
e5a0: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
e5b0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
e5c0: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
e5d0: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f  t<=iLast );..  /
e5e0: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
e5f0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
e600: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
e610: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
e620: 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73  e.  ** option is
e630: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
e640: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
e650: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
e660: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
e670: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
e680: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
e690: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
e6a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
e6b0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
e6c0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
e6d0: 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
e6e0: 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
e6f0: 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
e700: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
e710: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
e720: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
e730: 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
e740: 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
e750: 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
e760: 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
e770: 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
e780: 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
e790: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
e7a0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
e7b0: 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
e7c0: 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
e7d0: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
e7e0: 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30 20  &data[iPtr]))>0 
e7f0: 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74 61  && iFreeBlk<iSta
e800: 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rt ){.      if( 
e810: 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20  iFreeBlk<iPtr+4 
e820: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e830: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
e840: 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65      iPtr = iFree
e850: 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Blk;.    }.    i
e860: 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73  f( iFreeBlk>iLas
e870: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
e880: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
e890: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
e8a0: 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72  eBlk>iPtr || iFr
e8b0: 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20  eeBlk==0 );.  . 
e8c0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e8d0: 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69  int:.    **    i
e8e0: 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74  FreeBlk:   First
e8f0: 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72   freeblock after
e900: 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f   iStart, or zero
e910: 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20   if none.    ** 
e920: 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54     iPtr:       T
e930: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20  he address of a 
e940: 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65  pointer to iFree
e950: 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  Blk.    **.    *
e960: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
e970: 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c  f iFreeBlk shoul
e980: 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f  d be coalesced o
e990: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
e9a0: 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  Start..    */.  
e9b0: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26    if( iFreeBlk &
e9c0: 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42  & iEnd+3>=iFreeB
e9d0: 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61  lk ){.      nFra
e9e0: 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69  g = iFreeBlk - i
e9f0: 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69  End;.      if( i
ea00: 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72  End>iFreeBlk ) r
ea10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ea20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
ea30: 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b   iEnd = iFreeBlk
ea40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
ea50: 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a  a[iFreeBlk+2]);.
ea60: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e        if( iEnd >
ea70: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
ea80: 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e  bleSize ) return
ea90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eaa0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53 69 7a  BKPT;.      iSiz
eab0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
eac0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
ead0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
eae0: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
eaf0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
eb00: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
eb10: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
eb20: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
eb30: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
eb40: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
eb50: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
eb60: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
eb70: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
eb80: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
eb90: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
eba0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
ebb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ebc0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
ebd0: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
ebe0: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
ebf0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
ec00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
ec10: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
ec20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
ec30: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
ec40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ec50: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
ec60: 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61     nFrag += iSta
ec70: 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20  rt - iPtrEnd;.  
ec80: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
ec90: 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20  nd - iPtr;.     
eca0: 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72     iStart = iPtr
ecb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ecc0: 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61      if( nFrag>da
ecd0: 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75  ta[hdr+7] ) retu
ece0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ecf0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61  T_BKPT;.    data
ed00: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
ed10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61  ;.  }.  if( iSta
ed20: 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  rt==get2byte(&da
ed30: 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20  ta[hdr+5]) ){.  
ed40: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65    /* The new fre
ed50: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65  eblock is at the
ed60: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
ed70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ed80: 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a  rea,.    ** so j
ed90: 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63  ust extend the c
eda0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
edb0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
edc0: 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ate another.    
edd0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72  ** freelist entr
ede0: 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74  y */.    if( iPt
edf0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
ee00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ee10: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62  _BKPT;.    put2b
ee20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
ee30: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
ee40: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ee50: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
ee60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
ee70: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
ee80: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
ee90: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
eea0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
eeb0: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
eec0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
eed0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
eee0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
eef0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
ef00: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
ef10: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
ef20: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
ef30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ef40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
ef50: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
ef60: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
ef70: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
ef80: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
ef90: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
efa0: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
efb0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
efc0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
efd0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
efe0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
eff0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
f000: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
f010: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
f020: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
f030: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
f040: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
f050: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
f060: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
f070: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
f080: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
f090: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
f0a0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
f0b0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
f0c0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
f0d0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
f0e0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
f0f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
f100: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
f110: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
f120: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
f130: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
f140: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
f150: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
f160: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
f170: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f180: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
f190: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
f1a0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
f1b0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
f1c0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
f1d0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
f1e0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
f1f0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
f200: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
f210: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
f220: 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78  leaf;.  pPage->x
f230: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
f240: 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20  izePtr;.  pBt = 
f250: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
f260: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
f270: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
f280: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f  INTKEY) ){.    /
f290: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f2a0: 2d 30 33 36 34 30 2d 31 33 34 31 35 20 41 20 76  -03640-13415 A v
f2b0: 61 6c 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20  alue of 5 means 
f2c0: 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69  the page is an i
f2d0: 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74  nterior.    ** t
f2e0: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
f2f0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
f300: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
f310: 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b  TF_INTKEY)==5 );
f320: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f330: 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37  -OF: R-20501-617
f340: 39 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33  96 A value of 13
f350: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f360: 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a  is a leaf.    **
f370: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
f380: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f390: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
f3a0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
f3b0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
f3c0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f3d0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
f3e0: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
f3f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f400: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
f410: 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d  age->noPayload =
f420: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
f430: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f440: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b  reeParseCellPtr;
f450: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f460: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
f470: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
f480: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
f490: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
f4a0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
f4b0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
f4c0: 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  ad;.      pPage-
f4d0: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f4e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
f4f0: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a  oPayload;.    }.
f500: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
f510: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
f520: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
f530: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f540: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
f550: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
f560: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
f570: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f580: 3a 20 52 2d 32 37 32 32 35 2d 35 33 39 33 36 20  : R-27225-53936 
f590: 41 20 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61  A value of 2 mea
f5a0: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
f5b0: 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a  n interior.    *
f5c0: 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  * index b-tree p
f5d0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
f5e0: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
f5f0: 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20  A)==2 );.    /* 
f600: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
f610: 36 35 37 31 2d 31 31 36 31 35 20 41 20 76 61 6c  6571-11615 A val
f620: 75 65 20 6f 66 20 31 30 20 6d 65 61 6e 73 20 74  ue of 10 means t
f630: 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65 61  he page is a lea
f640: 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62  f.    ** index b
f650: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f660: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f670: 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41  ZERODATA|PTF_LEA
f680: 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50  F)==10 );.    pP
f690: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
f6a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
f6b0: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
f6c0: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
f6d0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
f6e0: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f6f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
f700: 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d  ndex;.    pPage-
f710: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
f720: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
f730: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
f740: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
f750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
f760: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
f770: 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f  7608-56469 Any o
f780: 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  ther value for t
f790: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
f7a0: 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e  ype is.    ** an
f7b0: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72   error. */.    r
f7c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f7d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
f7e0: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
f7f0: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
f800: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
f810: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f820: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
f830: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
f840: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
f850: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
f860: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
f870: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f880: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
f890: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f8a0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
f8b0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
f8c0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
f8d0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
f8e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
f8f0: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
f900: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
f910: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
f920: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
f930: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
f940: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
f950: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
f960: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
f970: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
f980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
f990: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
f9a0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
f9b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f9c0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
f9d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
f9e0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
f9f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
fa00: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
fa10: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
fa20: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
fa30: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
fa40: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
fa50: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
fa60: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
fa70: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
fa80: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
fa90: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
faa0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
fab0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
fac0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
fad0: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
fae0: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
faf0: 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20  {.    u16 pc;   
fb00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
fb10: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
fb20: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
fb30: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
fb40: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
fb50: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
fb60: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
fb70: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
fb80: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
fb90: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
fba0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
fbb0: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
fbc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
fbd0: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
fbe0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ture */.    int 
fbf0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
fc00: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
fc10: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
fc20: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
fc30: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
fc40: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
fc50: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
fc60: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
fc70: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46  er */.    int nF
fc80: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
fc90: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
fca0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
fcb0: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f  ge */.    int to
fcc0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
fcd0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
fce0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
fcf0: 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rea */.    int i
fd00: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
fd10: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
fd20: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
fd30: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ck offset */.   
fd40: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
fd50: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
fd60: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
fd70: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
fd80: 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67  ..    pBt = pPag
fd90: 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72  e->pBt;..    hdr
fda0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
fdb0: 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  set;.    data = 
fdc0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
fdd0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
fde0: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
fdf0: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
fe00: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
fe10: 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  dicating.    ** 
fe20: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
fe30: 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  type. */.    if(
fe40: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
fe50: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
fe60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fe70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
fe80: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
fe90: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
fea0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
feb0: 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65  536 );.    pPage
fec0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
fed0: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
fee0: 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65   - 1);.    pPage
fef0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
ff00: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
ff10: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
ff20: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
ff30: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
ff40: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
ff50: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
ff60: 72 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  rSize;.    pPage
ff70: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
ff80: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
ff90: 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c      pPage->aCell
ffa0: 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  Idx = &data[cell
ffb0: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61  Offset];.    pPa
ffc0: 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
ffd0: 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
ffe0: 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20  ldPtrSize];.    
fff0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10000 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
10010 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
10020 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
10030 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a  esignates.    **
10040 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10050 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
10060 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
10070 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
10080 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74  er is.    ** int
10090 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33  erpreted as 6553
100a0 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20  6. */.    top = 
100b0 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
100c0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
100d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
100e0 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
100f0 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10100 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10110 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  3 gives the.    
10120 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
10130 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
10140 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  */.    pPage->nC
10150 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
10160 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
10170 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
10180 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
10190 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
101a0 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
101b0 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
101c0 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
101d0 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
101e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
101f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10200 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
10210 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
10220 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20  _CELL(pBt) );.  
10230 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10240 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20  : R-24089-57979 
10250 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69  If a page contai
10260 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69  ns no cells (whi
10270 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a  ch is only.    *
10280 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  * possible for a
10290 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
102a0 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
102b0 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65  ins no rows) the
102c0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66  n the.    ** off
102d0 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
102e0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
102f0 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
10300 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
10310 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
10320 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20  reserved space. 
10330 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
10340 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
10350 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65   top==usableSize
10360 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
10370 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  ;..    /* A malf
10380 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
10390 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
103a0 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20  us to read past 
103b0 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f  the end.    ** o
103c0 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
103d0 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
103e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
103f0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
10400 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65  of code checks e
10410 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61  arly to see if a
10420 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20   cell extends.  
10430 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
10440 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
10450 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
10460 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
10470 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74  o be .    ** ret
10480 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
10490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65  ..    */.    iCe
104a0 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
104b0 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
104c0 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c  nCell;.    iCell
104d0 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
104e0 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70  e - 4;.    if( p
104f0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
10500 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
10510 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  k ){.      int i
10520 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10530 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
10540 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
10550 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
10560 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
10570 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
10580 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
10590 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
105a0 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
105b0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
105c0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
105d0 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
105e0 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61  yteAligned(&data
105f0 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
10600 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
10610 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
10620 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  rst );.        t
10630 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
10640 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  llLast );.      
10650 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
10660 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
10670 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ast ){.         
10680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10690 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
106a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
106b0 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  z = pPage->xCell
106c0 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74  Size(pPage, &dat
106d0 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20  a[pc]);.        
106e0 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
106f0 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
10700 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a         if( pc+sz
10710 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
10720 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10730 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10740 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
10750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10760 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
10770 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20  iCellLast++;.   
10780 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d   }  ..    /* Com
10790 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
107a0 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
107b0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49   page.    ** EVI
107c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38  DENCE-OF: R-2358
107d0 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d  8-34450 The two-
107e0 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
107f0 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74  offset 1 gives t
10800 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  he.    ** start 
10810 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65  of the first fre
10820 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  eblock on the pa
10830 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69  ge, or is zero i
10840 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
10850 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73     ** freeblocks
10860 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  . */.    pc = ge
10870 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
10880 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
10890 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
108a0 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
108b0 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
108c0 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
108d0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  */.    while( pc
108e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
108f0 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
10900 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
10910 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
10920 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
10930 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10940 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
10950 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
10960 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
10970 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   will.        **
10980 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65   always be at le
10990 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66  ast one cell bef
109a0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72  ore the first fr
109b0 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  eeblock..       
109c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f   **.        ** O
109d0 72 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  r, the freeblock
109e0 20 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20   is off the end 
109f0 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  of the page.    
10a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
10a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10a20 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
10a30 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
10a40 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10a50 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
10a60 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10a70 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
10a80 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e  if( (next>0 && n
10a90 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20  ext<=pc+size+3) 
10aa0 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
10ab0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10ac0 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
10ad0 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
10ae0 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20  ding order. And 
10af0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
10b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
10b10 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20  free-block must 
10b20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lie on the datab
10b30 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ase page.  */.  
10b40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10b50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10b60 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
10b70 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
10b80 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
10b90 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
10ba0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
10bb0 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
10bc0 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
10bd0 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
10be0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
10bf0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10c00 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10c10 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10c20 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
10c30 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
10c40 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
10c50 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
10c60 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
10c70 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
10c80 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
10c90 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
10ca0 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
10cb0 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
10cc0 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
10cd0 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
10ce0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
10cf0 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
10d00 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
10d10 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
10d20 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
10d30 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
10d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10d50 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
10d60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10d70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10d80 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
10d90 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
10da0 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
10db0 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
10dc0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
10dd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
10de0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10df0 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
10e00 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
10e10 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
10e20 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
10e30 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
10e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10e50 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
10e60 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
10e70 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
10e80 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
10e90 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
10ea0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
10eb0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
10ec0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
10ed0 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
10ee0 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
10ef0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
10f00 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
10f10 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
10f20 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
10f30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10f40 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10f50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
10f60 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
10f70 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
10f80 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10f90 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
10fa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10fb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
10fc0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
10fd0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
10fe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10ff0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11000 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
11010 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
11020 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
11030 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
11040 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
11050 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
11060 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
11070 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
11080 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
11090 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
110a0 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
110b0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
110c0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
110d0 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
110e0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
110f0 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
11100 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
11110 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
11120 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
11130 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
11140 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
11150 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
11160 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
11170 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
11180 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
11190 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
111a0 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
111b0 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
111c0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
111d0 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
111e0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
111f0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  e];.  pPage->nOv
11200 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
11210 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
11220 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
11230 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
11240 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
11250 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
11260 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
11270 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
11280 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
11290 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
112a0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
112b0 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
112c0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
112d0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
112e0 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
112f0 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
11300 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
11310 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
11320 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
11330 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
11340 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
11350 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
11360 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
11370 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
11380 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
11390 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
113a0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
113b0 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
113c0 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
113d0 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
113e0 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
113f0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
11400 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
11410 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  = pgno==1 ? 100 
11420 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
11430 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
11440 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
11450 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
11460 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
11470 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
11480 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
11490 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
114a0 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
114b0 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
114c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
114d0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
114e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
114f0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
11500 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
11510 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
11520 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
11530 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
11540 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
11550 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
11560 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
11570 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
11580 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
11590 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
115a0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
115b0 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
115c0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
115d0 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
115e0 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
115f0 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
11600 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
11610 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
11620 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
11630 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
11640 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
11650 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
11660 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11670 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
11680 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
11690 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
116a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
116b0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
116c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
116d0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
116e0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
116f0 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
11700 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
11710 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
11720 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
11730 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
11740 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
11750 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
11760 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
11770 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
11780 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
11790 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
117a0 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
117b0 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
117c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
117d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
117e0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
117f0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
11800 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
11810 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
11820 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  DbPage, flags);.
11830 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
11840 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
11850 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
11860 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
11870 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
11880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11890 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
118a0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
118b0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
118c0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
118d0 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
118e0 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
118f0 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
11900 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
11910 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
11920 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
11930 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
11940 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
11950 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
11960 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
11970 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
11980 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
11990 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
119a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
119b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
119c0 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
119d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
119e0 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
119f0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
11a00 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
11a10 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
11a20 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
11a30 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
11a40 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
11a50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11a60 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
11a70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
11a80 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
11a90 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
11aa0 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
11ab0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
11ac0 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
11ad0 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
11ae0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
11af0 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
11b00 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
11b10 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
11b20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
11b30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
11b40 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
11b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
11b60 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
11b70 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
11b80 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
11b90 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
11ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
11bb0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
11bc0 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
11bd0 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ze it..**.** If 
11be0 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65  pCur!=0 then the
11bf0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66   page is being f
11c00 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f  etched as part o
11c10 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  f a moveToChild(
11c20 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61  ).** call.  Do a
11c30 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
11c40 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
11c50 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
11c60 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68  se..** And if th
11c70 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74  e fetch fails, t
11c80 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
11c90 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d   decrement pCur-
11ca0 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  >iPage..**.** Th
11cb0 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65  e page is fetche
11cc0 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20  d as read-write 
11cd0 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e  unless pCur is n
11ce0 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a  ot NULL and is.*
11cf0 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  * a read-only cu
11d00 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rsor..**.** If a
11d10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11d20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
11d30 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
11d40 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
11d50 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
11d60 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
11d70 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
11d80 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
11d90 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
11da0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11dc0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
11dd0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
11de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11df0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11e00 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
11e10 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
11e20 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
11e30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11e40 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
11e50 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43  er here */.  BtC
11e60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e80 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76  Cursor to receiv
11e90 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e  e the page, or N
11ea0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ULL */.  int bRe
11eb0 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
11ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11ed0 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
11ee0 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
11ef0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
11f00 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
11f10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11f20 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11f30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
11f40 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65  Cur==0 || ppPage
11f50 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ==&pCur->apPage[
11f60 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
11f70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11f80 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
11f90 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
11fa0 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
11fb0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
11fc0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
11fd0 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
11fe0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
11ff0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12000 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12010 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
12020 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
12030 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12040 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
12050 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12060 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
12070 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
12080 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
12090 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
120a0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
120b0 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
120c0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
120d0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
120e0 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
120f0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
12100 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
12110 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
12120 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12140 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
12150 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Page);.      got
12160 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
12170 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
12180 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  }..  /* If obtai
12190 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
121a0 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
121b0 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
121c0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
121d0 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
121e0 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
121f0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
12200 72 0a 20 20 20 26 26 20 28 28 2a 70 70 50 61 67  r.   && ((*ppPag
12210 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
12220 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
12230 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
12240 79 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  y).  ){.    rc =
12250 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12260 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73  BKPT;.    releas
12270 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12280 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12290 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
122a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
122b0 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
122c0 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
122d0 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d  if( pCur ) pCur-
122e0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74  >iPage--;.  test
122f0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
12300 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
12310 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
12320 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
12330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12340 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
12350 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
12360 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
12370 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
12380 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12390 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
123a0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
123b0 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
123c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
123d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
123e0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
123f0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
12400 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
12410 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
12420 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
12430 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
12440 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
12450 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
12460 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12470 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
12480 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
12490 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
124a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
124b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
124c0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
124d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
124e0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
124f0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
12500 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
12510 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
12520 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
12530 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
12540 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
12550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
12560 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
12570 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
12580 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
12590 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
125a0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
125b0 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
125c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
125d0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
125e0 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
125f0 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
12600 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
12610 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
12620 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
12630 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
12640 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
12650 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
12660 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
12670 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
12680 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12690 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
126a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
126b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
126c0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
126d0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
126e0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
126f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12700 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
12710 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
12720 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12730 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12740 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12750 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12760 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12770 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
12780 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
12790 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
127a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
127b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
127c0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
127d0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
127e0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
127f0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12800 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
12810 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
12820 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12830 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12840 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12850 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12860 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12870 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
12880 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
12890 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
128a0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
128b0 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
128c0 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
128d0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
128e0 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
128f0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
12900 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
12910 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
12920 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
12930 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12940 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12950 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12960 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12970 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12980 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12990 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
129a0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
129b0 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
129c0 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
129d0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
129e0 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
129f0 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
12a00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
12a10 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
12a20 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
12a30 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12a40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12a50 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12a60 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12a70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12a80 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12a90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12aa0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12ab0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12ac0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12ad0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12ae0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12af0 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
12b00 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
12b10 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
12b20 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12b30 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12b40 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12b50 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12b60 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12b70 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12b80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12b90 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12ba0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12bb0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12bc0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12bd0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
12be0 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
12bf0 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
12c00 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
12c10 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
12c20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12c30 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12c40 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12c50 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12c60 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12c70 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12c80 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12c90 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12ca0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12cb0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12cc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
12cd0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12ce0 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
12cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12d00 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
12d10 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
12d20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12d30 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12d40 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12d50 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12d60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12d70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12d80 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12d90 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12da0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12db0 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12dc0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
12dd0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
12de0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
12df0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
12e00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12e10 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
12e20 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
12e30 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
12e40 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12e50 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
12e60 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
12e70 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
12e80 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
12e90 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
12ea0 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
12eb0 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
12ec0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
12ed0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
12ee0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
12ef0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
12f00 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
12f10 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
12f20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
12f30 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
12f40 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
12f50 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12f60 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
12f70 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
12f80 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
12f90 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
12fa0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
12fb0 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
12fc0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
12fd0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
12fe0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
12ff0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
13000 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
13010 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
13020 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
13030 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
13040 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
13050 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
13060 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
13070 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
13080 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
13090 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
130a0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
130b0 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
130c0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
130d0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
130e0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
130f0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
13100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
13110 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
13120 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
13130 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
13140 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
13150 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
13160 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13170 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
13180 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
13190 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
131a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
131b0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
131c0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
131d0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
131e0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
131f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
13200 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
13210 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13220 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
13230 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
13240 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
13250 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
13260 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
13270 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
13280 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
13290 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
132a0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
132b0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
132c0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
132d0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
132e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
132f0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
13300 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
13310 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
13320 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
13330 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
13350 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
13360 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13370 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
13380 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
13390 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
133a0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
133b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
133c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
133d0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
133e0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
133f0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
13400 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
13410 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
13420 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
13430 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
13440 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
13450 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
13460 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
13470 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
13480 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
13490 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
134a0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
134b0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
134c0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
134d0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
134e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
134f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
13500 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
13510 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
13520 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
13530 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
13540 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
13550 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
13560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13570 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
13580 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
13590 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
135a0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
135b0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
135c0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
135d0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
135e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
135f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
13600 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
13610 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
13620 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13630 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
13640 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13650 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
13660 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
13670 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
13680 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
13690 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
136a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
136b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
136c0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
136d0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
136e0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
136f0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
13700 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
13710 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
13720 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
13730 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
13740 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
13750 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
13760 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13770 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
13780 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
13790 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
137a0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
137b0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
137c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
137d0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
137e0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
137f0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
13800 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
13810 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
13820 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
13830 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13840 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
13850 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
13860 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
13870 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
13880 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
13890 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
138a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
138b0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
138c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
138d0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
138e0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
138f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13900 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
13910 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
13920 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
13930 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
13940 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13950 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
13960 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
13970 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
13980 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
13990 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
139a0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
139b0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
139c0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
139d0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
139e0 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
139f0 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
13a00 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
13a10 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
13a20 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
13a30 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
13a40 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
13a50 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
13a60 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
13a70 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
13a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
13a90 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
13aa0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
13ab0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13ac0 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
13ad0 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
13ae0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
13af0 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
13b00 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
13b10 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
13b20 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
13b30 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
13b40 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
13b50 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
13b60 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
13b70 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13b80 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
13b90 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
13ba0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
13bb0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
13bc0 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
13bd0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
13be0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13bf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13c00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13c10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
13c20 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
13c30 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
13c40 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
13c50 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
13c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13c80 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
13c90 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
13cd0 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
13ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13d00 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
13d10 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13d20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13d30 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
13d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13d50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
13d60 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
13d70 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
13d80 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
13d90 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
13da0 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
13db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13dc0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
13dd0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
13de0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
13df0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13e00 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13e10 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
13e20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13e30 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
13e40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
13e50 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
13e60 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
13e70 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
13e80 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
13e90 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
13ea0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
13eb0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
13ec0 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
13ed0 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
13ee0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
13ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
13f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f10 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
13f20 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
13f30 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
13f40 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
13f50 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
13f60 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
13f70 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
13f80 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
13f90 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
13fa0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
13fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
13fc0 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
13fd0 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13ff0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14000 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14030 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
14040 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14050 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14060 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14080 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
14090 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
140a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
140b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
140c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
140d0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
140e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
140f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
14100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14120 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14130 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
14140 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
14150 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14160 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
14170 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14180 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14190 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
141a0 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
141b0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
141c0 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
141d0 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
141e0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
141f0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
14200 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
14210 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
14220 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
14230 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
14240 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
14250 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
14260 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
14270 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
14280 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
14290 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
142a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
142b0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
142c0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
142d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
142e0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
142f0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
14300 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
14310 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
14320 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
14330 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
14340 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
14350 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
14360 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
14370 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
14380 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
14390 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
143a0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
143b0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
143c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
143d0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
143e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
143f0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
14400 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14410 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
14420 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14430 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
14440 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
14450 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
14460 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
14470 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
14480 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14490 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
144a0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
144b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
144c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
144d0 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
144e0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
144f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14500 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
14510 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
14520 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
14530 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
14540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14550 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14560 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
14570 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
14580 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
14590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
145a0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
145b0 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
145c0 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
145d0 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
145e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
145f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
14600 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
14610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
14620 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
14630 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
14640 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
14650 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
14660 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
14670 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
14680 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
14690 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
146a0 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
146b0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
146c0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
146d0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
146e0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
146f0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
14700 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
14710 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
14720 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14730 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
14740 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
14750 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
14760 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
14770 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
14780 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
14790 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
147a0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
147b0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
147c0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
147d0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
147e0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
147f0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
14800 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
14810 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
14820 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
14830 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
14840 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
14850 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
14860 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
14870 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
14880 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
14890 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
148a0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
148b0 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
148c0 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
148d0 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
148e0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
148f0 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
14900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14910 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
14920 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
14930 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
14940 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
14950 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
14960 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
14970 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
14980 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
14990 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
149a0 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
149b0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
149c0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
149d0 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
149e0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
149f0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
14a00 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
14a10 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
14a20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
14a30 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
14a40 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
14a50 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
14a60 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
14a70 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
14a80 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
14a90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
14aa0 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
14ab0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
14ac0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14ad0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
14ae0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
14af0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
14b00 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
14b10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14b20 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
14b30 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
14b40 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
14b50 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
14b60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
14b70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
14b80 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
14b90 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
14ba0 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
14bb0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
14bc0 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
14bd0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14be0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
14bf0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
14c00 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
14c10 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
14c20 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
14c30 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
14c40 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
14c50 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14c60 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14c70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14c90 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
14ca0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14cb0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14cc0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
14cd0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14ce0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14cf0 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
14d00 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
14d10 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
14d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14d30 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
14d40 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
14d50 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
14d60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
14d70 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14d80 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
14d90 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
14da0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
14db0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
14dc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
14dd0 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
14de0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
14df0 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
14e00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
14e10 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
14e20 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
14e30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14e40 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
14e50 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
14e60 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
14e70 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
14e80 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
14e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14ea0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
14eb0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
14ec0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
14ed0 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
14ee0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
14ef0 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
14f00 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14f10 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14f20 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14f30 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14f40 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14f50 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
14f60 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
14f70 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
14f80 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
14f90 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
14fa0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14fb0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
14fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14fd0 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
14fe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14ff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15000 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
15010 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
15020 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
15030 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
15040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15050 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15060 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
15070 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
15080 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
15090 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
150a0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
150b0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
150c0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
150d0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
150e0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
150f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15100 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
15110 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
15120 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
15130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15140 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
15150 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15160 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
15170 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
15180 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
15190 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
151a0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
151b0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
151c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
151d0 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
151e0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
151f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
15200 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
15210 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
15220 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
15230 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
15240 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
15250 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
15260 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
15270 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
15280 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
15290 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
152a0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
152b0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
152c0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
152d0 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
152e0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
152f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
15300 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
15310 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
15320 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
15330 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
15340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
15350 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
15360 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15370 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15380 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
15390 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
153a0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
153b0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
153c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
153d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
153e0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
153f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
15400 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
15410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15420 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
15430 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15440 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
15450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15460 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
15470 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
15480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15490 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
154a0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
154b0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
154c0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
154d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
154e0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
154f0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
15500 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
15510 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
15520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15530 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
15540 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15550 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
15560 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15570 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
15580 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
15590 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
155a0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
155b0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
155c0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
155d0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
155e0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
155f0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
15600 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
15610 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
15620 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
15630 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
15640 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15650 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
15660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
15670 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15680 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
15690 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
156a0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
156b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
156c0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
156d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
156e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
156f0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
15700 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15710 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
15720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
15740 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
15750 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
15760 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
15770 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
15780 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
15790 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
157a0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
157b0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
157c0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
157d0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
157e0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
157f0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
15800 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
15810 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
15820 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
15830 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
15840 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
15850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15860 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
15870 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15880 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
15890 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
158a0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
158b0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
158c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
158d0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
158e0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
158f0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
15900 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
15910 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15920 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
15930 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
15940 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
15950 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
15960 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
15970 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
15980 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15990 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
159a0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
159b0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
159c0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
159d0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
159e0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
159f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15a00 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
15a10 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15a20 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
15a30 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
15a40 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
15a50 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
15a60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
15a70 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
15a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15a90 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
15aa0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
15ab0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
15ac0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
15ad0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
15ae0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
15af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15b00 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
15b10 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
15b20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
15b30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
15b40 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
15b50 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
15b60 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
15b70 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
15b80 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
15b90 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
15ba0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
15bb0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
15bc0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
15bd0 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
15be0 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
15bf0 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
15c00 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
15c10 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
15c20 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
15c30 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
15c40 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
15c50 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
15c60 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
15c70 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
15c80 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
15c90 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
15ca0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
15cb0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
15cc0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
15cd0 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
15ce0 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
15cf0 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
15d00 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
15d10 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
15d20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
15d30 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
15d40 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
15d50 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
15d60 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
15d70 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
15d80 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
15d90 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
15da0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
15db0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
15dc0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
15dd0 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
15de0 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
15df0 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
15e00 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
15e10 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
15e20 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
15e30 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
15e40 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
15e50 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
15e60 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
15e70 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
15e80 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
15e90 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
15ea0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
15eb0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
15ec0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
15ed0 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
15ee0 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
15ef0 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
15f00 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
15f10 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
15f20 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
15f30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
15f40 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
15f50 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
15f60 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
15f70 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
15f80 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
15f90 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
15fa0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
15fb0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
15fc0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
15fd0 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
15fe0 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
15ff0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
16000 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16010 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
16020 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
16030 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
16040 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
16050 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16060 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
16070 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
16080 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
16090 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
160a0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
160b0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
160c0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
160d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
160e0 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
160f0 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
16100 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
16110 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
16120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
16130 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
16140 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
16150 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
16160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16170 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
16180 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
16190 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
161a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
161b0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
161c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
161d0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
161e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
161f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16200 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16210 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16220 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
16230 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
16240 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
16250 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
16260 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
16270 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
16280 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
16290 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
162a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
162b0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
162c0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
162d0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
162e0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
162f0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
16300 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
16310 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
16320 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
16330 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
16340 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
16350 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
16360 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
16370 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
16380 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
16390 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
163a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
163b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
163c0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
163d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
163e0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
163f0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
16400 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
16410 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
16420 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
16430 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
16440 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
16450 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
16460 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16470 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
16480 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
16490 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
164a0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
164b0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
164c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
164d0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
164e0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
164f0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
16500 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
16510 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
16520 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
16530 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
16540 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
16550 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
16560 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
16570 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16580 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
16590 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
165a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
165b0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
165c0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
165d0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
165e0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
165f0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
16600 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16610 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
16620 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
16630 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16650 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
16660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16670 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16680 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
16690 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
166a0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
166b0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
166c0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
166d0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
166e0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
166f0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
16700 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
16710 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
16720 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
16730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16750 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
16760 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
16770 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
16780 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
16790 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
167a0 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
167b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
167c0 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
167d0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
167e0 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
167f0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
16800 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
16810 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
16820 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
16830 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
16840 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
16850 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
16860 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
16870 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
16880 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
16890 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
168a0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
168b0 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
168c0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
168d0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
168e0 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
168f0 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
16900 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
16910 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
16920 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
16930 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
16940 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
16950 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
16960 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
16970 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
16980 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
16990 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
169a0 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
169b0 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
169c0 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
169d0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
169e0 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
169f0 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
16a00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16a10 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
16a20 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
16a30 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16a40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16a50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16a60 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16a70 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16a80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16a90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16aa0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
16ab0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16ac0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16ad0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16af0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
16b00 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
16b10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
16b20 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
16b30 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
16b40 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
16b50 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
16b60 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
16b70 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
16b80 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
16b90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
16ba0 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
16bb0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16bc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16bd0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16be0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16bf0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16c00 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
16c10 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
16c20 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
16c30 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
16c40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16c60 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
16c70 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
16c80 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
16c90 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
16ca0 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
16cb0 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
16cc0 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
16cd0 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
16ce0 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
16cf0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
16d00 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
16d10 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
16d20 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
16d30 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
16d40 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
16d50 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
16d60 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
16d70 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
16d80 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
16d90 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
16da0 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
16db0 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
16dc0 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
16dd0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
16de0 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
16df0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
16e00 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
16e10 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
16e20 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
16e30 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
16e40 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
16e50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
16e60 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
16e70 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
16e80 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
16e90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
16ea0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
16eb0 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
16ec0 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
16ed0 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
16ee0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
16ef0 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
16f00 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
16f10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16f20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16f30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16f40 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16f50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f60 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16f70 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
16f80 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
16f90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16fa0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16fc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
16fd0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
16fe0 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
16ff0 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
17000 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
17010 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
17020 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
17030 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
17040 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
17050 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17060 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
17070 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
17080 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17090 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
170a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
170b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
170c0 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
170d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
170e0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
170f0 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
17100 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
17110 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
17120 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
17130 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17140 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
17160 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
17170 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
17180 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
17190 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
171a0 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
171b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
171c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
171d0 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
171e0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
171f0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
17200 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
17210 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
17220 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
17230 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
17240 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
17250 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
17260 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
17270 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
17280 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
17290 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
172a0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
172b0 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
172c0 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
172d0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
172e0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
172f0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
17300 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
17310 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
17320 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
17330 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
17340 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
17350 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
17360 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
17370 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
17380 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
17390 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
173a0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
173b0 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
173c0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
173d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
173e0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
173f0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
17400 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
17410 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
17420 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
17430 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
17440 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
17450 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
17460 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
17470 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
17480 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
17490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
174a0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
174b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
174c0 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
174d0 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
174e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
174f0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
17500 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17510 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
17520 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
17530 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
17540 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17550 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
17560 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
17570 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
17580 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
17590 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
175a0 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
175b0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
175c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
175d0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
175e0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
175f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17610 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
17620 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
17630 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
17640 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
17650 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
17660 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
17670 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
17680 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
17690 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
176a0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
176b0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
176c0 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
176d0 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
176e0 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
176f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
17700 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
17710 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
17720 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
17730 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
17740 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
17750 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
17760 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
17770 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17780 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
17790 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
177a0 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
177b0 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
177c0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
177d0 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
177e0 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
177f0 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
17800 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
17810 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
17820 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17830 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17840 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17850 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
17860 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
17870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17880 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
17890 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
178a0 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
178b0 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
178c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
178d0 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
178e0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
178f0 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
17900 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
17910 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
17920 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
17930 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
17940 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
17950 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
17960 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
17970 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
17980 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
17990 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
179a0 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
179b0 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
179c0 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
179d0 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
179e0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
179f0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
17a00 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
17a10 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
17a20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17a30 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
17a40 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
17a50 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
17a60 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
17a70 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
17a80 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
17a90 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
17aa0 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
17ab0 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
17ac0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17ad0 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
17ae0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
17af0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17b00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17b10 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
17b20 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
17b30 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
17b40 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
17b50 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
17b60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17b70 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17b80 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17b90 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
17ba0 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
17bb0 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
17bc0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
17bd0 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
17be0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
17bf0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
17c00 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
17c10 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
17c20 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
17c30 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17c40 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
17c50 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
17c60 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
17c70 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
17c80 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
17c90 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
17ca0 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
17cb0 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
17cc0 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
17cd0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
17ce0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17cf0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
17d00 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
17d10 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
17d20 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17d30 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
17d40 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17d50 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
17d60 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17d70 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
17d80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17d90 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17da0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17db0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17dc0 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
17dd0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
17de0 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
17df0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
17e00 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
17e10 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
17e20 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
17e30 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
17e40 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
17e50 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
17e60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17e70 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
17e80 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17e90 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17ea0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17eb0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17ec0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
17ed0 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
17ee0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
17ef0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17f00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17f10 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
17f20 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
17f30 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
17f40 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
17f50 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
17f60 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
17f70 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
17f80 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
17f90 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
17fa0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17fb0 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
17fc0 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
17fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17fe0 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
17ff0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
18000 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
18010 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
18020 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
18030 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18040 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
18050 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
18060 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
18070 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
18080 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
18090 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
180a0 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
180b0 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
180c0 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
180d0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
180e0 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
180f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18100 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
18110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
18120 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
18130 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
18140 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
18150 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
18160 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
18170 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
18180 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
18190 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
181a0 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
181b0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
181c0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
181d0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
181e0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
181f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
18200 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18210 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
18220 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18230 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
18240 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
18250 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
18260 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
18270 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
18280 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
18290 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
182a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
182b0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
182c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
182d0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
182e0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
182f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18300 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
18310 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
18320 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
18330 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
18340 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
18350 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
18360 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
18370 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18380 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
18390 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
183a0 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
183b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
183c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
183d0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
183e0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
183f0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
18400 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
18410 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
18420 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
18430 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
18440 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18450 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
18460 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
18470 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
18480 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
18490 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
184a0 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
184b0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
184c0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
184d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
184e0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
184f0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
18500 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
18510 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
18520 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
18530 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
18540 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
18550 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
18560 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
18570 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18580 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18590 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
185a0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
185b0 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
185c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
185d0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
185e0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
185f0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
18600 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
18610 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
18620 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
18630 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
18640 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
18650 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
18660 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
18670 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
18680 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
18690 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
186a0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
186b0 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
186c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
186d0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
186e0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
186f0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
18700 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
18710 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
18720 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18730 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
18740 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
18750 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
18760 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
18770 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
18780 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
18790 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
187a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
187b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
187c0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
187d0 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
187e0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
187f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18800 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
18810 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
18820 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
18830 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18840 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
18850 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
18860 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18870 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18880 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18890 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
188a0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
188b0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
188c0 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
188d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
188e0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
188f0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
18900 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
18910 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
18920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18930 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
18940 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
18950 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
18960 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
18970 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
18980 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
18990 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
189a0 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
189b0 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
189c0 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
189d0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
189e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
189f0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
18a00 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
18a10 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
18a20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
18a30 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
18a40 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
18a50 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
18a60 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
18a70 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
18a80 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
18a90 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
18aa0 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
18ab0 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
18ac0 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
18ad0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18ae0 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
18af0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
18b00 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
18b10 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
18b20 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
18b30 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
18b40 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
18b50 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
18b60 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
18b70 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
18b80 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
18b90 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
18ba0 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
18bb0 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
18bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18bd0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18be0 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
18bf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
18c00 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
18c10 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
18c20 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
18c30 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
18c40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
18c50 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
18c60 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18c70 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18c80 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
18c90 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
18ca0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
18cb0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
18cc0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
18cd0 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
18ce0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18cf0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18d00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
18d10 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
18d20 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
18d30 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
18d40 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
18d50 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
18d60 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
18d70 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
18d80 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
18d90 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
18da0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
18db0 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
18dc0 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
18dd0 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
18de0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
18df0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
18e00 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
18e10 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
18e20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
18e30 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
18e40 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
18e50 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
18e60 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
18e70 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
18e80 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
18e90 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
18ea0 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
18eb0 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
18ec0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18ed0 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
18ee0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18ef0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
18f00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
18f10 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
18f20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18f30 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
18f40 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
18f50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18f70 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18f80 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
18f90 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
18fa0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
18fb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
18fc0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
18fd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
18ff0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
19000 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
19010 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19020 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
19030 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
19040 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
19050 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
19060 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
19070 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
19080 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
19090 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
190a0 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
190b0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
190c0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
190d0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
190e0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
190f0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
19100 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
19110 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
19120 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
19130 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
19140 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
19150 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
19160 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19170 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19180 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19190 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
191a0 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
191b0 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
191c0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
191d0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
191e0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
191f0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
19200 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
19210 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
19220 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
19230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19240 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
19250 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
19260 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
19270 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19280 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19290 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
192a0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
192b0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
192c0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
192d0 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
192e0 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
192f0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
19300 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
19310 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
19320 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
19330 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
19340 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
19350 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19360 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19370 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19380 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19390 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
193a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
193b0 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
193c0 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
193d0 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
193e0 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
193f0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
19400 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19410 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
19420 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
19430 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
19440 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
19450 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
19460 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19470 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19480 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19490 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
194a0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
194b0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
194c0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
194d0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
194e0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
194f0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
19500 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
19510 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
19520 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
19530 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
19540 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
19550 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
19560 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19570 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19580 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
195a0 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
195b0 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
195c0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
195d0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
195e0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
195f0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
19600 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
19610 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
19620 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
19630 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
19640 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
19650 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19660 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
19670 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19680 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19690 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
196a0 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
196b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
196c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
196d0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
196e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
196f0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
19700 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
19710 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
19720 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
19730 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
19740 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
19750 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
19760 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
19770 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
197a0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
197b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
197c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
197d0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
197e0 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
197f0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
19800 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
19810 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
19820 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19830 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19840 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19850 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19860 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
19870 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19880 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19890 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
198a0 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
198b0 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
198c0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
198d0 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
198e0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
198f0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
19900 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
19910 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
19920 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
19930 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19940 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19950 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19960 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19970 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19980 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19990 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
199a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
199b0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
199c0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
199d0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
199e0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
199f0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
19a00 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
19a10 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
19a20 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
19a30 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
19a40 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19a50 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19a60 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19a70 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19a80 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19a90 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19aa0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19ab0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19ac0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19ad0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19ae0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
19af0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
19b00 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
19b10 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
19b20 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
19b30 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
19b40 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19b50 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19b60 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19b70 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19b80 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19b90 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19ba0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19bb0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19bc0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19bd0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19be0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
19bf0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
19c00 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
19c10 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
19c20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
19c30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
19c40 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19c50 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19c60 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19c70 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19c80 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19c90 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19ca0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19cb0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19cc0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19cd0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19ce0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19cf0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19d00 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19d10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
19d20 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
19d30 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
19d40 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19d50 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
19d60 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19d70 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19d80 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19d90 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19da0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19db0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19dc0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19dd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19de0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19df0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19e00 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19e10 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19e20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19e30 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19e40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19e50 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19e60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19e70 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
19e80 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
19e90 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19ea0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
19eb0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19ec0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
19ed0 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19ee0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19ef0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19f00 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19f10 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19f20 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19f30 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19f40 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19f50 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19f60 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19f70 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
19f80 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
19f90 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19fa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
19fb0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
19fc0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
19fd0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19fe0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19ff0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1a000 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1a010 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1a020 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1a030 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1a040 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1a050 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1a060 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1a070 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1a080 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1a090 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1a0a0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1a0b0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a0c0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a0d0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a0e0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a0f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a100 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1a110 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1a120 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1a130 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1a140 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1a150 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1a160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1a170 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a180 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1a190 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1a1a0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1a1b0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1a1c0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1a1d0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1a1e0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1a1f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1a200 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1a210 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1a220 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1a230 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a240 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a250 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a260 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a270 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a280 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a290 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a2a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a2b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a2c0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a2d0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a2e0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a2f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a300 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a310 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a320 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a330 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a340 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a350 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a360 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a370 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a380 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a390 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a3a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a3b0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a3c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a3d0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a3e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a3f0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a400 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a410 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a420 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a430 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a440 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a450 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a460 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a470 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a480 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a490 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a4a0 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a4b0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a4c0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a4d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a4e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a4f0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a500 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a510 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a520 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a530 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a540 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a550 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a560 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a570 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a590 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a5a0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a5b0 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a5c0 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a5d0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a5e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a5f0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a600 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a610 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a620 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a630 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a640 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a650 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a660 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a670 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a680 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a690 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a6a0 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a6b0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a6c0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a6d0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a6e0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a6f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a700 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a710 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a720 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a730 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a740 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a750 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a760 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a770 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a780 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a790 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a7a0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a7b0 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a7c0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a7d0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a7e0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a7f0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a800 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a810 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a830 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a840 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a850 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a860 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a870 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a880 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1a890 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1a8a0 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1a8b0 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1a8c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a8d0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1a8e0 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1a8f0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1a900 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1a910 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1a920 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1a930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a940 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1a950 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1a960 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a970 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1a980 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1a990 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1a9a0 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1a9b0 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1a9c0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1a9d0 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1a9e0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1a9f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1aa00 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1aa10 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1aa20 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1aa30 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1aa40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1aa50 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1aa60 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1aa70 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1aa80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1aa90 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1aaa0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1aab0 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1aac0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1aad0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1aae0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1aaf0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1ab00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1ab10 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1ab20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1ab30 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1ab40 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1ab50 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1ab60 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1ab70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1ab80 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1ab90 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1aba0 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1abb0 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1abc0 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1abd0 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1abe0 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1abf0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1ac00 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1ac10 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1ac20 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1ac30 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1ac40 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1ac50 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1ac60 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1ac70 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1ac80 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1ac90 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1aca0 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1acb0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1acc0 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1acd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1ace0 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1acf0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1ad00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1ad10 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1ad20 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1ad30 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1ad40 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ad50 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1ad60 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1ad70 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1ad80 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ad90 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1ada0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1adb0 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1adc0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1add0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1ade0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1adf0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1ae00 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1ae10 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1ae20 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1ae30 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1ae40 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1ae50 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1ae60 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1ae70 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1ae80 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1ae90 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1aea0 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1aeb0 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1aec0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1aed0 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1aee0 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1aef0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1af00 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1af10 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1af20 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1af30 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1af40 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1af50 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1af60 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1af70 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1af80 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1af90 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1afa0 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1afb0 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1afc0 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1afd0 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1afe0 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1aff0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1b000 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1b010 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1b020 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1b030 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1b040 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1b050 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1b060 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1b070 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1b080 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1b090 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1b0a0 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1b0b0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1b0c0 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1b0d0 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1b0e0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1b0f0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1b100 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1b110 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1b120 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1b130 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1b140 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b150 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1b160 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1b170 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f  .  sqlite3 *pBlo
1b180 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ck = 0;.  BtShar
1b190 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b1a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b1b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
1b1c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b1d0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b1e0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1b1f0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1b200 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1b210 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1b220 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1b230 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1b240 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1b250 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1b260 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1b270 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1b280 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1b290 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b2a0 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1b2b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1b2c0 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1b2d0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b2e0 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1b2f0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b300 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b310 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1b320 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1b330 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
1b340 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
1b350 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
1b360 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
1b370 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1b380 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1b390 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1b3a0 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
1b3b0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
1b3c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1b3d0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b3e0 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
1b3f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b400 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
1b410 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1b420 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1b430 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1b440 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1b450 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
1b460 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
1b470 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
1b480 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
1b490 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
1b4a0 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1b4b0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1b4c0 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
1b4d0 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b4e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b4f0 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42  WRITE).   || (pB
1b500 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1b510 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20  S_PENDING)!=0.  
1b520 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
1b530 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1b540 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
1b550 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
1b560 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
1b570 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1b580 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1b590 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1b5a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
1b5b0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1b5c0 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
1b5d0 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b5e0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
1b5f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b600 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
1b610 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1b620 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1b630 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1b640 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1b650 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1b660 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
1b670 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1b680 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1b690 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1b6a0 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1b6b0 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1b6c0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1b6d0 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1b6e0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1b6f0 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1b700 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1b710 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1b720 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1b730 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1b740 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1b750 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1b760 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1b770 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1b780 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1b790 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b7a0 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1b7b0 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1b7c0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1b7d0 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1b7e0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1b7f0 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1b800 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1b810 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1b820 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1b830 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1b840 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1b850 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1b860 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1b870 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1b880 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1b890 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1b8a0 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1b8b0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1b8c0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1b8d0 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1b8e0 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1b8f0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1b900 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1b910 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1b920 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1b930 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1b940 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1b950 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1b960 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1b970 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1b980 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1b990 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1b9a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1b9b0 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1b9c0 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1b9d0 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1b9e0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1b9f0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1ba00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ba10 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1ba20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1ba30 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1ba40 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1ba50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ba60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1ba70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ba80 20 20 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20       int exFlag 
1ba90 3d 20 28 70 2d 3e 64 62 2d 3e 62 55 6e 6c 6f 63  = (p->db->bUnloc
1baa0 6b 65 64 20 26 26 20 21 49 53 41 55 54 4f 56 41  ked && !ISAUTOVA
1bab0 43 55 55 4d 29 20 3f 20 2d 31 20 3a 20 28 77 72  CUUM) ? -1 : (wr
1bac0 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
1bad0 20 69 6e 74 20 62 53 75 62 6a 49 6e 4d 65 6d 20   int bSubjInMem 
1bae0 3d 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  = sqlite3TempInM
1baf0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 3b 0a 20 20  emory(p->db);.  
1bb00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1bb10 3e 64 62 2d 3e 62 55 6e 6c 6f 63 6b 65 64 3d 3d  >db->bUnlocked==
1bb20 30 20 7c 7c 20 77 72 66 6c 61 67 3d 3d 31 20 29  0 || wrflag==1 )
1bb30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1bb40 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1bb50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78  (pBt->pPager, ex
1bb60 46 6c 61 67 2c 20 62 53 75 62 6a 49 6e 4d 65 6d  Flag, bSubjInMem
1bb70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1bb80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bb90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1bba0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1bbb0 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
1bbc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1bbd0 55 4e 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  UNLOCKED.       
1bbe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bbf0 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61 67  OK && sqlite3Pag
1bc00 65 72 49 73 55 6e 6c 6f 63 6b 65 64 28 70 42 74  erIsUnlocked(pBt
1bc10 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
1bc20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
1bc30 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
1bc40 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
1bc50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
1bc60 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1bc70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bc80 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
1bc90 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1bca0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1bcb0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
1bcc0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
1bcd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1bce0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
1bcf0 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
1bd00 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
1bd10 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
1bd20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bd30 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1bd40 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1bd50 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1bd60 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1bd70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1bd80 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1bd90 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1bda0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1bdb0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1bdc0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1bdd0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1bde0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1bdf0 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1be00 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1be10 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1be20 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1be30 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1be40 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1be50 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1be60 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1be70 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1be80 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1be90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1bea0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1beb0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1bec0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1bed0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1bee0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1bef0 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1bf00 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1bf10 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1bf20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1bf30 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1bf40 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1bf50 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1bf60 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1bf70 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1bf80 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1bf90 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1bfa0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1bfb0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1bfc0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1bfd0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1bfe0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1bff0 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1c000 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1c010 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1c020 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1c030 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1c040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c050 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1c060 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1c070 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1c080 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1c090 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1c0a0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1c0b0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1c0c0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1c0d0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1c0e0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1c0f0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1c100 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1c110 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1c120 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c140 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1c150 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1c160 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1c170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1c180 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c190 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1c1a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1c1b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c1c0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1c1d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1c1e0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1c1f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c210 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
1c220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c230 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1c240 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1c250 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
1c260 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
1c270 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
1c280 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
1c290 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
1c2a0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1c2b0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
1c2c0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
1c2d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1c2e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1c2f0 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1c300 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1c310 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
1c320 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t nSavepoint = p
1c330 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1c340 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1c350 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1c360 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1c370 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , nSavepoint);. 
1c380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c390 45 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69  E_OK && nSavepoi
1c3a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1c3b0 20 62 74 72 65 65 50 74 72 6d 61 70 42 65 67 69   btreePtrmapBegi
1c3c0 6e 28 70 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e  n(pBt, nSavepoin
1c3d0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
1c3e0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1c3f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1c400 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1c410 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1c420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c430 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
1c440 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
1c450 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
1c460 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
1c470 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
1c480 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
1c490 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
1c4a0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1c4b0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
1c4c0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1c4d0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1c4e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1c4f0 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
1c500 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
1c510 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
1c520 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1c530 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
1c560 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
1c570 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1c580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c590 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
1c5a0 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
1c5b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c5e0 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
1c5f0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1c600 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
1c610 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
1c620 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
1c630 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1c640 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1c650 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c660 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1c670 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
1c680 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1c690 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1c6b0 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
1c6c0 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
1c6d0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1c6e0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1c6f0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1c700 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1c710 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1c720 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1c730 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1c740 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1c750 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1c760 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1c770 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1c780 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1c790 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1c7a0 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1c7b0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1c7c0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1c7d0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1c7e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1c7f0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1c800 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c810 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c820 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1c830 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1c840 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1c850 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1c860 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
1c870 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
1c880 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
1c890 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
1c8a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c8b0 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
1c8c0 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
1c8d0 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
1c8e0 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
1c8f0 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
1c900 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1c910 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
1c920 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
1c930 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
1c940 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
1c950 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
1c960 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
1c970 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
1c980 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
1c990 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1c9a0 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
1c9b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1c9c0 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
1c9d0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1c9e0 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
1c9f0 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1ca00 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1ca10 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
1ca20 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
1ca30 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1ca40 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
1ca50 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
1ca60 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
1ca70 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
1ca80 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
1ca90 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
1caa0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1cab0 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1cae0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
1caf0 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
1cb00 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
1cb10 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
1cb20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
1cb30 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
1cb40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1cb50 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1cb60 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1cb70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1cb80 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
1cb90 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1cba0 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
1cbb0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1cbc0 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
1cbd0 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
1cbe0 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
1cbf0 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
1cc00 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
1cc10 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
1cc20 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1cc30 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1cc40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1cc50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1cc60 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
1cc70 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
1cc80 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1cc90 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
1cca0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
1ccb0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1ccc0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  nt nCell;.    in
1ccd0 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20  t rc;..    rc = 
1cce0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1ccf0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1cd00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1cd10 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
1cd20 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
1cd30 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1cd40 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
1cd50 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1cd60 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
1cd70 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1cd80 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
1cd90 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
1cda0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70   info;.        p
1cdb0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
1cdc0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1cdd0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
1cde0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
1cdf0 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43  w.         && pC
1ce00 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
1ce10 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ow+3<=pPage->aDa
1ce20 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
1ce30 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
1ce40 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
1ce50 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1ce60 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29  flow]).        )
1ce70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1ce80 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1ce90 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
1cea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1ceb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1cec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ced0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1cee0 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
1cef0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1cf00 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
1cf10 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1cf20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cf30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1cf40 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
1cf50 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1cf60 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
1cf70 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
1cf80 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1cf90 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1cfa0 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
1cfb0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1cfc0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1cfd0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
1cfe0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1cff0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d000 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1d010 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
1d020 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
1d030 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
1d040 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d050 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1d060 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1d070 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1d080 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1d090 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1d0a0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1d0b0 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1d0c0 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1d0d0 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1d0e0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1d0f0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1d100 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1d110 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1d120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1d130 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1d140 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1d150 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1d160 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1d170 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1d180 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1d190 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1d1a0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1d1b0 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1d1c0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1d1d0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1d1e0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1d1f0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1d200 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1d210 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1d220 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1d230 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1d240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1d250 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1d260 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1d270 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1d280 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1d290 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1d2a0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1d2b0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1d2c0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1d2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d2e0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1d2f0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1d300 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1d310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1d320 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1d330 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1d340 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1d350 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1d360 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1d370 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1d380 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1d390 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1d3a0 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1d3b0 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1d3c0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1d3d0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1d3e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1d3f0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1d400 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1d410 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1d420 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1d430 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1d440 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1d450 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1d460 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d470 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d480 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d490 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1d4a0 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1d4b0 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1d4c0 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1d4d0 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1d4e0 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1d4f0 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1d500 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1d510 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1d520 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1d530 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1d540 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1d550 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1d560 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1d570 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1d580 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1d590 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1d5a0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1d5b0 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1d5c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d5d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d5e0 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1d5f0 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1d600 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1d610 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1d620 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1d630 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1d640 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1d650 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1d660 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1d670 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1d680 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1d690 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1d6a0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1d6b0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1d6c0 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1d6d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1d6e0 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1d6f0 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1d700 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1d710 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1d720 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1d730 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1d740 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1d750 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1d760 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1d770 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1d780 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1d790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d7a0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1d7b0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1d7c0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1d7d0 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1d7e0 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1d7f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1d830 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1d840 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1d850 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1d860 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1d870 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1d880 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1d890 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1d8a0 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1d8b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d8c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d8d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d8e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d8f0 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1d900 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1d910 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1d920 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1d930 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1d940 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1d950 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1d960 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1d970 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1d980 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1d990 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1d9a0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1d9b0 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1d9c0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1d9d0 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1d9e0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1d9f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1da00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1da10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1da20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1da30 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1da40 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1da50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1da60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1da70 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1da80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1da90 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1daa0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1dab0 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1dac0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1dad0 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1dae0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1daf0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1db00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1db10 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1db20 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1db30 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1db40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1db50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1db60 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1db70 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1db80 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1db90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1dba0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1dbb0 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1dbc0 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1dbd0 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1dbe0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1dbf0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1dc00 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1dc10 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1dc20 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1dc30 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1dc40 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1dc50 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1dc60 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1dc70 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1dc80 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1dc90 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1dca0 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1dcb0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1dcc0 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1dcd0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1dce0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1dcf0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1dd00 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1dd10 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1dd20 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1dd30 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1dd40 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1dd50 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1dd60 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1dd70 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1dd80 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1dd90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1dda0 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1ddb0 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1ddc0 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1ddd0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1dde0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1ddf0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1de00 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1de10 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1de20 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1de30 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1de40 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1de50 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1de60 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1de70 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1de80 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1de90 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1dea0 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1deb0 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1dec0 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1ded0 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1dee0 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1def0 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1df00 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1df10 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1df20 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1df30 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1df40 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1df50 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1df60 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1df70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1df80 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1df90 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1dfa0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1dfb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1dfc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1dfd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1dfe0 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1dff0 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1e000 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1e010 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1e020 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1e030 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1e040 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1e050 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1e060 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1e070 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1e080 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1e090 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1e0a0 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1e0b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e0c0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1e0d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1e0e0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1e0f0 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1e100 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e130 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1e140 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1e150 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1e160 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e170 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1e180 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e190 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1e1a0 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1e1b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e1c0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1e1d0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1e1e0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1e1f0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1e200 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1e210 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1e220 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1e230 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1e240 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1e250 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1e260 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1e270 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1e280 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1e290 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1e2a0 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1e2b0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1e2c0 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1e2d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e2e0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1e2f0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1e300 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1e310 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1e320 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1e330 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1e340 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1e350 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1e360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1e3a0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1e3b0 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1e3c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e3d0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1e3e0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1e3f0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1e400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e410 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1e420 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1e430 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1e440 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1e450 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1e460 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1e470 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1e480 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1e490 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1e4a0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1e4b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1e4c0 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1e4d0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1e4e0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1e4f0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1e500 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1e510 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1e520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e540 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e550 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e560 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1e570 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1e580 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1e590 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1e5a0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1e5b0 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1e5c0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1e5d0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1e5e0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1e5f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1e600 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1e610 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1e620 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1e630 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1e640 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1e650 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1e660 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1e670 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1e680 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1e690 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1e6a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e6b0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1e6c0 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1e6d0 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1e6e0 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1e6f0 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1e700 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1e710 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1e720 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1e730 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e740 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1e750 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1e760 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1e770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1e790 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1e7a0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1e7b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e7c0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1e7d0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1e7e0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1e7f0 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1e800 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1e810 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e820 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1e830 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1e840 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1e850 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1e860 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1e870 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1e880 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e890 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1e8a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e8c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1e8d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1e8e0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1e8f0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1e900 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1e910 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1e920 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e930 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1e940 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1e950 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1e960 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1e970 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1e980 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1e990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e9a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1e9b0 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1e9c0 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1e9d0 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1e9e0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1e9f0 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1ea00 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1ea10 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1ea20 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1ea30 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1ea40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ea50 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1ea60 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1ea70 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1ea80 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1ea90 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1eaa0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1eab0 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1eac0 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1eaf0 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1eb00 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1eb10 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1eb40 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1eb50 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1eb60 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1eb70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1eb80 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1eb90 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1eba0 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1ebb0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1ebc0 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1ebd0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1ebe0 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1ebf0 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1ec00 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1ec10 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1ec20 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1ec30 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1ec40 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ec50 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1ec60 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1ec70 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1ec80 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1ec90 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1eca0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1ecb0 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1ecc0 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1ecd0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1ece0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1ecf0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1ed00 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1ed10 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1ed20 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1ed30 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1ed40 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1ed50 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1ed60 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1ed70 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1ed80 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1ed90 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1eda0 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1edb0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1edc0 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1edd0 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1ede0 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1edf0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1ee00 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1ee10 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ee20 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1ee30 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1ee40 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1ee50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1ee60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1ee70 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1ee80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ee90 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1eea0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1eeb0 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1eec0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1eed0 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1eee0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1eef0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ef00 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1ef10 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1ef20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1ef30 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1ef40 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1ef50 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ef60 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1ef70 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1ef80 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1ef90 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1efa0 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1efb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1efc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1efd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1efe0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1eff0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1f000 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1f010 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f030 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1f040 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1f050 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1f060 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1f070 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1f080 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1f090 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f0a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f0b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f0c0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1f0d0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f0e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f0f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f100 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1f110 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1f120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f130 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1f140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1f150 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1f160 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f170 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f180 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1f190 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1f1a0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1f1b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1f1c0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1f1d0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1f1e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1f1f0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1f200 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1f210 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1f220 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1f230 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1f240 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1f250 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1f260 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1f270 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1f280 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1f290 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1f2a0 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1f2b0 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1f2c0 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
1f2d0 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
1f2e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1f2f0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
1f300 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
1f310 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f320 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1f330 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1f340 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
1f350 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
1f360 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1f370 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
1f380 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f390 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1f3a0 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
1f3b0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1f3c0 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
1f3d0 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
1f3e0 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
1f3f0 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
1f400 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1f410 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f420 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1f430 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
1f440 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
1f450 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
1f460 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1f470 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1f480 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
1f490 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
1f4a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1f4b0 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
1f4c0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
1f4d0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1f4e0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1f4f0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
1f500 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
1f510 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1f520 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
1f530 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f540 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
1f550 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f560 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1f570 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
1f580 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
1f590 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
1f5a0 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1f5b0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1f5c0 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1f5d0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1f5e0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1f5f0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1f600 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1f610 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1f620 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1f630 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1f640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f650 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f660 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1f670 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f680 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1f690 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1f6a0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1f6b0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1f6c0 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1f6d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f6e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f6f0 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1f700 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1f710 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1f720 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1f730 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1f740 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1f750 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1f760 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1f770 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1f780 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1f790 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1f7a0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1f7b0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1f7c0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1f7d0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1f7e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f7f0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1f800 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f810 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f820 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f830 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1f840 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1f850 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f860 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1f870 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f880 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1f890 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1f8a0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1f8b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1f8c0 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1f8d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f8e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1f8f0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1f900 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1f910 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1f920 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1f930 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1f940 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1f950 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1f960 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1f970 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1f980 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1f990 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1f9a0 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1f9b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f9c0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 45 44 0a 2f 2a  ABLE_UNLOCKED./*
1f9d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f9e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1f9f0 61 72 74 20 6f 66 20 6d 65 72 67 69 6e 67 20 61  art of merging a
1fa00 6e 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61 6e 73  n UNLOCKED trans
1fa10 61 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 74  action with.** t
1fa20 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74  he snapshot at t
1fa30 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 77  he head of the w
1fa40 61 6c 20 66 69 6c 65 2e 20 49 74 20 72 65 6c 6f  al file. It relo
1fa50 63 61 74 65 73 20 61 6c 6c 20 70 61 67 65 73 20  cates all pages 
1fa60 69 6e 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20  in the.** range 
1fa70 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69  iFirst..iLast, i
1fa80 6e 63 6c 75 73 69 76 65 2e 20 49 74 20 69 73 20  nclusive. It is 
1fa90 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1faa0 20 42 74 72 65 65 50 74 72 6d 61 70 20 0a 2a 2a   BtreePtrmap .**
1fab0 20 73 74 72 75 63 74 75 72 65 20 61 74 20 42 74   structure at Bt
1fac0 53 68 61 72 65 64 2e 70 4d 61 70 20 63 6f 6e 74  Shared.pMap cont
1fad0 61 69 6e 73 20 74 68 65 20 6c 6f 63 61 74 69 6f  ains the locatio
1fae0 6e 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  n of the pointer
1faf0 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 70 61 67  s to each.** pag
1fb00 65 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a  e in the range..
1fb10 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 75 72 72 65  **.** If pnCurre
1fb20 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1fb30 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1fb40 65 20 72 61 6e 67 65 20 61 72 65 20 6d 6f 76 65  e range are move
1fb50 64 20 74 6f 20 63 75 72 72 65 6e 74 6c 79 0a 2a  d to currently.*
1fb60 2a 20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73  * free locations
1fb70 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74   (i.e. free-list
1fb80 20 65 6e 74 72 69 65 73 29 20 77 69 74 68 69 6e   entries) within
1fb90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fba0 6c 65 20 62 65 66 6f 72 65 20 70 61 67 65 0a 2a  le before page.*
1fbb0 2a 20 69 46 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  * iFirst..**.** 
1fbc0 4f 72 2c 20 69 66 20 70 6e 43 75 72 72 65 6e 74  Or, if pnCurrent
1fbd0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1fbe0 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  en it points to 
1fbf0 61 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 69  a value containi
1fc00 6e 67 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  ng the.** curren
1fc10 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
1fc20 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1fc30 61 67 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ages. In this ca
1fc40 73 65 2c 20 61 6c 6c 20 70 61 67 65 73 20 61 72  se, all pages ar
1fc50 65 0a 2a 2a 20 72 65 6c 6f 63 61 74 65 64 20 74  e.** relocated t
1fc60 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1fc70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2d   database file -
1fc80 20 70 61 67 65 20 69 46 69 72 73 74 20 69 73 20   page iFirst is 
1fc90 72 65 6c 6f 63 61 74 65 64 20 74 6f 0a 2a 2a 20  relocated to.** 
1fca0 70 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74  page (*pnCurrent
1fcb0 2b 31 29 2c 20 70 61 67 65 20 69 46 69 72 73 74  +1), page iFirst
1fcc0 2b 31 20 74 6f 20 70 61 67 65 20 28 2a 70 6e 43  +1 to page (*pnC
1fcd0 75 72 72 65 6e 74 2b 32 29 2c 20 61 6e 64 20 73  urrent+2), and s
1fce0 6f 20 6f 6e 2e 0a 2a 2a 20 56 61 6c 75 65 20 2a  o on..** Value *
1fcf0 70 6e 43 75 72 72 65 6e 74 20 69 73 20 73 65 74  pnCurrent is set
1fd00 20 74 6f 20 74 68 65 20 6e 65 77 20 73 69 7a 65   to the new size
1fd10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fd20 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
1fd30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1fd40 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  s..**.** If no e
1fd50 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1fd60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fd70 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
1fd80 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1fd90 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
1fda0 6e 74 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65  nt btreeRelocate
1fdb0 52 61 6e 67 65 28 0a 20 20 42 74 53 68 61 72 65  Range(.  BtShare
1fdc0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1fdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 74 72           /* B-tr
1fde0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50  ee handle */.  P
1fdf0 67 6e 6f 20 69 46 69 72 73 74 2c 20 20 20 20 20  gno iFirst,     
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe10 2a 20 46 69 72 73 74 20 70 61 67 65 20 74 6f 20  * First page to 
1fe20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67  relocate */.  Pg
1fe30 6e 6f 20 69 4c 61 73 74 2c 20 20 20 20 20 20 20  no iLast,       
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe50 20 4c 61 73 74 20 70 61 67 65 20 74 6f 20 72 65   Last page to re
1fe60 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f  locate */.  Pgno
1fe70 20 2a 70 6e 43 75 72 72 65 6e 74 20 20 20 20 20   *pnCurrent     
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fe90 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 49 4e 2f 4f  f not NULL, IN/O
1fea0 55 54 3a 20 44 61 74 61 62 61 73 65 20 73 69 7a  UT: Database siz
1feb0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1fec0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fed0 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61  BtreePtrmap *pMa
1fee0 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20  p = pBt->pMap;. 
1fef0 20 50 67 6e 6f 20 69 50 67 3b 0a 0a 20 20 66 6f   Pgno iPg;..  fo
1ff00 72 28 69 50 67 3d 69 46 69 72 73 74 3b 20 69 50  r(iPg=iFirst; iP
1ff10 67 3c 3d 69 4c 61 73 74 20 26 26 20 72 63 3d 3d  g<=iLast && rc==
1ff20 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 50 67 2b 2b  SQLITE_OK; iPg++
1ff30 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
1ff40 70 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 2f  pFree = 0;     /
1ff50 2a 20 50 61 67 65 20 61 6c 6c 6f 63 61 74 65 64  * Page allocated
1ff60 20 66 72 6f 6d 20 66 72 65 65 2d 6c 69 73 74 20   from free-list 
1ff70 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
1ff80 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e  pPg = 0;.    Pgn
1ff90 6f 20 69 4e 65 77 3b 20 20 20 20 20 20 20 20 20  o iNew;         
1ffa0 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 67 65       /* New page
1ffb0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
1ffc0 2a 2f 0a 20 20 20 20 50 74 72 6d 61 70 45 6e 74  */.    PtrmapEnt
1ffd0 72 79 20 2a 70 45 6e 74 72 79 3b 20 20 20 20 2f  ry *pEntry;    /
1ffe0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  * Pointer map en
1fff0 74 72 79 20 66 6f 72 20 70 61 67 65 20 69 50 67  try for page iPg
20000 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 69 50 67   */..    if( iPg
20010 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
20020 41 47 45 28 70 42 74 29 20 29 20 63 6f 6e 74 69  AGE(pBt) ) conti
20030 6e 75 65 3b 0a 20 20 20 20 70 45 6e 74 72 79 20  nue;.    pEntry 
20040 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b 69 50  = &pMap->aPtr[iP
20050 67 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74  g - pMap->iFirst
20060 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 45 6e 74  ];..    if( pEnt
20070 72 79 2d 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41  ry->eType==PTRMA
20080 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
20090 20 20 20 20 50 67 6e 6f 20 64 75 6d 6d 79 3b 0a      Pgno dummy;.
200a0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
200b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
200c0 2c 20 26 70 46 72 65 65 2c 20 26 64 75 6d 6d 79  , &pFree, &dummy
200d0 2c 20 69 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  , iPg, BTALLOC_E
200e0 58 41 43 54 29 3b 0a 20 20 20 20 20 20 72 65 6c  XACT);.      rel
200f0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 29 3b  easePage(pFree);
20100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
20110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
20120 64 75 6d 6d 79 3d 3d 69 50 67 20 29 3b 0a 20 20  dummy==iPg );.  
20130 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 75    }else if( pnCu
20140 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 62  rrent ){.      b
20150 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
20160 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a   iPg, &pPg, 0);.
20170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
20180 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
20190 65 61 62 6c 65 28 70 50 67 2d 3e 70 44 62 50 61  eable(pPg->pDbPa
201a0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ge) );.      ass
201b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
201c0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  rPageRefcount(pP
201d0 67 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31 20 29  g->pDbPage)==1 )
201e0 3b 0a 20 20 20 20 20 20 69 4e 65 77 20 3d 20 2b  ;.      iNew = +
201f0 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b 0a 20  +(*pnCurrent);. 
20200 20 20 20 20 20 69 66 28 20 69 4e 65 77 3d 3d 50       if( iNew==P
20210 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20220 28 70 42 74 29 20 29 20 69 4e 65 77 20 3d 20 2b  (pBt) ) iNew = +
20230 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b 0a 20  +(*pnCurrent);. 
20240 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
20250 74 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c  tePage(pBt, pPg,
20260 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20   pEntry->eType, 
20270 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 20  pEntry->parent, 
20280 69 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 20 20  iNew, 1);.      
20290 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
202a0 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ll(pPg);.    }el
202b0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61  se{.      rc = a
202c0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
202d0 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20 26 69  (pBt, &pFree, &i
202e0 4e 65 77 2c 20 69 46 69 72 73 74 2d 31 2c 20 42  New, iFirst-1, B
202f0 54 41 4c 4c 4f 43 5f 4c 45 29 3b 0a 20 20 20 20  TALLOC_LE);.    
20300 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20310 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 77 3c  LITE_OK || iNew<
20320 69 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  iFirst );.      
20330 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
20340 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
20350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20360 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
20370 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pPg = 0;.       
20380 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
20390 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29  t, iPg, &pPg, 0)
203a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ;.        rc = r
203b0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
203c0 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54   pPg, pEntry->eT
203d0 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72  ype, pEntry->par
203e0 65 6e 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20  ent,iNew,1);.   
203f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20400 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
20410 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20430 68 65 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  he b-tree handle
20440 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
20450 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nly argument is 
20460 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20  about to commit 
20470 61 6e 0a 2a 2a 20 55 4e 4c 4f 43 4b 45 44 20 74  an.** UNLOCKED t
20480 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 74  ransaction. At t
20490 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 20  his point it is 
204a0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
204b0 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73 73  this is .** poss
204c0 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20 57  ible - the wal W
204d0 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68 65  RITER lock is he
204e0 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e 6f  ld and it is kno
204f0 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61 72  wn that there ar
20500 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69 63  e .** no conflic
20510 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74 65  ts with committe
20520 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
20530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
20540 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 42  reeFixUnlocked(B
20550 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
20560 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20570 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
20580 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
20590 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d 20  ge1;.  u8 *p1 = 
205a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
205b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
205c0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
205d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
205e0 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61 67  OK;..  /* If pag
205f0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
20600 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74 61  ase is not writa
20610 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61 67  ble, then no pag
20620 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65  es were allocate
20630 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64 20  d.  ** or freed 
20640 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  by this transact
20650 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
20660 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61 6e  e no special han
20670 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 72  dling is .  ** r
20680 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
20690 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69 73  se, if page 1 is
206a0 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64 2e   dirty, proceed.
206b0 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72 6d    */.  BtreePtrm
206c0 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
206d0 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54 72  pMap;.  Pgno iTr
206e0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
206f0 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f 20  p1[32]);.  Pgno 
20700 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  nPage = btreePag
20710 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 75  ecount(pBt);.  u
20720 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  32 nFree = get4b
20730 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20  yte(&p1[36]);.. 
20740 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20750 50 61 67 65 72 49 73 55 6e 6c 6f 63 6b 65 64 28  PagerIsUnlocked(
20760 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
20770 65 72 74 28 20 70 42 74 2d 3e 70 4d 61 70 20 29  ert( pBt->pMap )
20780 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
20790 50 61 67 65 72 55 70 67 72 61 64 65 53 6e 61 70  PagerUpgradeSnap
207a0 73 68 6f 74 28 70 50 61 67 65 72 2c 20 70 50 61  shot(pPager, pPa
207b0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
207c0 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 50 61   assert( p1==pPa
207d0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
207e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
207f0 4f 4b 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  OK ){.    Pgno n
20800 48 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  HPage = get4byte
20810 28 26 70 31 5b 32 38 5d 29 3b 0a 20 20 20 20 50  (&p1[28]);.    P
20820 67 6e 6f 20 6e 46 69 6e 20 3d 20 6e 48 50 61 67  gno nFin = nHPag
20830 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  e;         /* Si
20840 7a 65 20 6f 66 20 64 62 20 61 66 74 65 72 20 74  ze of db after t
20850 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 72 67 65  ransaction merge
20860 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 73 71 6c   */..    if( sql
20870 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
20880 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
20890 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 50  Page) ){.      P
208a0 67 6e 6f 20 69 48 54 72 75 6e 6b 20 3d 20 67 65  gno iHTrunk = ge
208b0 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 29 3b  t4byte(&p1[32]);
208c0 0a 20 20 20 20 20 20 75 33 32 20 6e 48 46 72 65  .      u32 nHFre
208d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31  e = get4byte(&p1
208e0 5b 33 36 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  [36]);..      /*
208f0 20 41 74 74 61 63 68 20 74 68 65 20 68 65 61 64   Attach the head
20900 20 64 61 74 61 62 61 73 65 20 66 72 65 65 20 6c   database free l
20910 69 73 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ist to the end o
20920 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  f the current.  
20930 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
20940 6f 6e 73 20 66 72 65 65 2d 6c 69 73 74 20 28 69  ons free-list (i
20950 66 20 61 6e 79 29 2e 20 20 2a 2f 0a 20 20 20 20  f any).  */.    
20960 20 20 69 66 28 20 69 54 72 75 6e 6b 21 3d 30 20    if( iTrunk!=0 
20970 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
20980 79 74 65 28 26 70 31 5b 33 36 5d 2c 20 6e 48 46  yte(&p1[36], nHF
20990 72 65 65 20 2b 20 6e 46 72 65 65 29 3b 0a 20 20  ree + nFree);.  
209a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
209b0 70 31 5b 33 32 5d 2c 20 69 54 72 75 6e 6b 29 3b  p1[32], iTrunk);
209c0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
209d0 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
209e0 20 20 20 20 44 62 50 61 67 65 20 2a 70 54 72 75      DbPage *pTru
209f0 6e 6b 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  nk = sqlite3Page
20a00 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
20a10 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
20a20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
20a30 62 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b  byte((u8*)pTrunk
20a40 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
20a50 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3d 3d      if( iTrunk==
20a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
20a70 20 70 75 74 34 62 79 74 65 28 28 75 38 2a 29 70   put4byte((u8*)p
20a80 54 72 75 6e 6b 2d 3e 70 44 61 74 61 2c 20 69 48  Trunk->pData, iH
20a90 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
20aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
20ab0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20ac0 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  pTrunk);.       
20ad0 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   };.      }..   
20ae0 20 20 20 69 66 28 20 6e 48 50 61 67 65 3c 28 70     if( nHPage<(p
20af0 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 29  Map->iFirst-1) )
20b00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
20b10 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 69 73   database consis
20b20 74 65 64 20 6f 66 20 28 70 4d 61 70 2d 3e 69 46  ted of (pMap->iF
20b30 69 72 73 74 2d 31 29 20 70 61 67 65 73 20 77 68  irst-1) pages wh
20b40 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  en the current. 
20b50 20 20 20 20 20 20 20 2a 2a 20 75 6e 6c 6f 63 6b         ** unlock
20b60 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ed transaction w
20b70 61 73 20 6f 70 65 6e 65 64 2e 20 41 6e 64 20 61  as opened. And a
20b80 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 72 61 6e 73  n unlocked trans
20b90 61 63 74 69 6f 6e 20 6d 61 79 0a 20 20 20 20 20  action may.     
20ba0 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 65 78 65     ** not be exe
20bb0 63 75 74 65 64 20 6f 6e 20 61 6e 20 61 75 74 6f  cuted on an auto
20bc0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
20bd0 20 2d 20 73 6f 20 74 68 65 20 64 62 20 73 68 6f   - so the db sho
20be0 75 6c 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  uld .        ** 
20bf0 6e 6f 74 20 68 61 76 65 20 73 68 72 75 6e 6b 20  not have shrunk 
20c00 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61  since the transa
20c10 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
20c20 2e 20 54 68 65 72 65 66 6f 72 65 20 6e 48 50 61  . Therefore nHPa
20c30 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ge.        ** sh
20c40 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 28  ould be set to (
20c50 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20  pMap->iFirst-1) 
20c60 6f 72 20 67 72 65 61 74 65 72 2e 20 2a 2f 0a 20  or greater. */. 
20c70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20c80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20c90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
20cb0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
20cc0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73   allocated pages
20cd0 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 74 68   pMap->iFirst th
20ce0 72 6f 75 67 68 0a 20 20 20 20 20 20 20 20 2a 2a  rough.        **
20cf0 20 6e 50 61 67 65 20 28 69 6e 63 6c 75 73 69 76   nPage (inclusiv
20d00 65 29 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  e) at the end of
20d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20d20 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a 20  le. Meanwhile,. 
20d30 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
20d40 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68 61 76  transactions hav
20d50 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 46 69  e allocated (iFi
20d60 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53 6f  rst..nHPage). So
20d70 20 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a   move.        **
20d80 20 70 61 67 65 73 20 28 69 46 69 72 73 74 2e 2e   pages (iFirst..
20d90 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67 65  MIN(nPage,nHPage
20da0 29 29 20 74 6f 20 28 4d 41 58 28 6e 50 61 67 65  )) to (MAX(nPage
20db0 2c 6e 48 50 61 67 65 29 2b 31 29 2e 20 20 2a 2f  ,nHPage)+1).  */
20dc0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4c  .        Pgno iL
20dd0 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c  ast = MIN(nPage,
20de0 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f 2a 20   nHPage);    /* 
20df0 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d 6f 76  Last page to mov
20e00 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e  e */.        Pgn
20e10 6f 20 6e 43 75 72 72 65 6e 74 3b 20 20 20 20 20  o nCurrent;     
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
20e40 20 6f 66 20 64 62 20 2a 2f 0a 20 20 20 20 20 20   of db */.      
20e50 20 20 6e 43 75 72 72 65 6e 74 20 3d 20 4d 41 58    nCurrent = MAX
20e60 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29 3b  (nPage, nHPage);
20e70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
20e80 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
20e90 28 70 42 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72  (pBt, pMap->iFir
20ea0 73 74 2c 20 69 4c 61 73 74 2c 20 26 6e 43 75 72  st, iLast, &nCur
20eb0 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  rent);..        
20ec0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77  /* There are now
20ed0 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77   no collisions w
20ee0 69 74 68 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ith the snapshot
20ef0 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 20   at the head of 
20f00 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
20f10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
20f20 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
20f30 74 20 77 6f 75 6c 64 20 62 65 20 70 6f 73 73 69  t would be possi
20f40 62 6c 65 20 74 6f 20 77 72 69 74 65 0a 20 20 20  ble to write.   
20f50 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e       ** the tran
20f60 73 61 63 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  saction out to d
20f70 69 73 6b 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  isk. Before doin
20f80 67 20 73 6f 20 74 68 6f 75 67 68 2c 20 61 74 74  g so though, att
20f90 65 6d 70 74 20 74 6f 0a 20 20 20 20 20 20 20 20  empt to.        
20fa0 2a 2a 20 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65  ** relocate some
20fb0 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61 67 65   of the new page
20fc0 73 20 74 6f 20 66 72 65 65 20 6c 6f 63 61 74 69  s to free locati
20fd0 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 62  ons within the b
20fe0 6f 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ody.        ** o
20ff0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21000 69 6c 65 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c  ile (i.e. free-l
21010 69 73 74 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f  ist entries). */
21020 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
21030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21050 6e 43 75 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e  nCurrent!=PENDIN
21060 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21070 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
21080 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73  lite3PagerSetDbs
21090 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
210a0 20 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   nCurrent);.    
210b0 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65        nFree = ge
210c0 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b  t4byte(&p1[36]);
210d0 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20  .          nFin 
210e0 3d 20 4d 41 58 28 6e 43 75 72 72 65 6e 74 2d 6e  = MAX(nCurrent-n
210f0 46 72 65 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20  Free, nHPage);. 
21100 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 75           if( nCu
21110 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59  rrent>PENDING_BY
21120 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
21130 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin<=PENDING_BY
21140 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
21150 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e              nFin
21160 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  --;.          }.
21170 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
21180 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67  treeRelocateRang
21190 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c 20 6e  e(pBt, nFin+1, n
211a0 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  Current, 0);.   
211b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
211c0 70 75 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  put4byte(&p1[28]
211d0 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 7d  , nFin);.      }
211e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
211f0 65 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65  e3PagerSetDbsize
21200 28 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  (pPager, nFin);.
21210 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
21220 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
21230 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
21240 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
21250 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
21260 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
21270 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
21280 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
21290 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
212a0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
212b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
212c0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
212d0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
212e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
212f0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
21300 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
21310 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
21320 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
21330 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
21340 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
21350 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
21360 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
21370 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
21380 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
21390 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
213a0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
213b0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
213c0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
213d0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
213e0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
213f0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
21400 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
21410 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
21420 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
21430 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
21440 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21450 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
21460 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
21470 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
21480 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
21490 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
214a0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
214b0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
214c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
214d0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
214e0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
214f0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
21500 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
21510 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
21520 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
21530 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
21540 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
21550 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
21560 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
21570 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
21580 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
21590 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
215a0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
215b0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
215c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
215d0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
215e0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
215f0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
21600 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
21610 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
21620 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
21630 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
21640 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
21650 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
21660 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
21670 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
21680 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
21690 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
216a0 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
216b0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
216c0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
216d0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
216e0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
216f0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
21700 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
21710 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
21720 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
21730 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
21740 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
21750 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
21760 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
21770 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
21780 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
21790 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
217a0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
217b0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
217c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
217d0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
217e0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
217f0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
21800 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21810 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21820 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64  Enter(p);..#ifnd
21830 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
21840 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
21850 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21860 6d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m ){.      asser
21870 74 28 20 49 53 55 4e 4c 4f 43 4b 45 44 3d 3d 30  t( ISUNLOCKED==0
21880 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
21890 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
218a0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
218b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
218c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
218d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
218e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
218f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21900 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
21910 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
21920 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
21930 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
21940 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
21950 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
21960 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  if.    if( rc==S
21970 51 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 55 4e  QLITE_OK && ISUN
21980 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
21990 72 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e 6c  rc = btreeFixUnl
219a0 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a  ocked(p);.    }.
219b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
219c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
219d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
219e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
219f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
21a00 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ter, 0);.    }. 
21a10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21a20 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
21a30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21a40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21a50 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
21a60 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
21a70 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
21a80 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
21a90 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
21aa0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
21ab0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
21ac0 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
21ad0 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
21ae0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
21af0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21b00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
21b10 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
21b20 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
21b30 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
21b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21b50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
21b60 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
21b70 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
21b80 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
21b90 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
21ba0 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
21bb0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
21bc0 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
21bd0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
21be0 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
21bf0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
21c00 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
21c10 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
21c20 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
21c30 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
21c40 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
21c50 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
21c60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
21c70 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
21c80 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
21c90 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
21ca0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
21cb0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
21cc0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
21cd0 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
21ce0 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
21cf0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
21d00 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
21d10 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
21d20 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
21d30 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
21d40 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
21d50 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
21d60 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
21d70 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
21d80 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
21d90 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
21da0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
21db0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
21dc0 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
21dd0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
21de0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
21df0 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
21e00 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21e10 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
21e20 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
21e30 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
21e40 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
21e50 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
21e60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21e70 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
21e80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21e90 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
21ea0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
21eb0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
21ec0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
21ed0 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
21ee0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
21ef0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
21f00 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
21f10 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
21f20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
21f30 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
21f40 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
21f50 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  d(pBt);.  }..  /
21f60 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
21f70 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61 6e 73 61   UNLOCKED transa
21f80 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65 20 74 68  ction, delete th
21f90 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f 62 6a 65  e pBt->pMap obje
21fa0 63 74 20 2a 2f 0a 20 20 62 74 72 65 65 50 74 72  ct */.  btreePtr
21fb0 6d 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b 0a  mapDelete(pBt);.
21fc0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
21fd0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
21fe0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
21ff0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
22000 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
22010 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22020 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
22030 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
22040 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
22050 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
22060 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
22070 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ne() routine doe
22080 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
22090 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  e and should.** 
220a0 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72  be invoked prior
220b0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
220c0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
220d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
220e0 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72  tPhaseOne().** r
220f0 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74  outine did all t
22100 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
22110 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
22120 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
22130 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
22140 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
22150 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
22160 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
22170 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
22180 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
22190 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
221a0 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20   or truncate or 
221b0 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20  zero the header 
221c0 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f  in the.** the ro
221d0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28  llback journal (
221e0 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
221f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
22200 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64  commit) and.** d
22210 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
22220 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e   Normally, if an
22230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
22240 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61  ile the pager la
22250 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e  yer is attemptin
22260 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a  g to .** finaliz
22270 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
22280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
22290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
222a0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e  urns an error an
222b0 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c  d.** the upper l
222c0 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70  ayer will attemp
222d0 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f  t a rollback. Ho
222e0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65  wever, if the se
222f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
22300 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65   is non-zero the
22310 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72  n this b-tree tr
22320 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72  ansaction is par
22330 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
22340 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  e .** transactio
22350 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  n. In this case,
22360 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22370 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
22380 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20  n committed .** 
22390 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d  (by deleting a m
223a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
223b0 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  le) and the call
223c0 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74  er will ignore t
223d0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
223e0 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53  s return code. S
223f0 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  o, even if an er
22400 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
22410 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a  e pager layer,.*
22420 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72  * reset the b-tr
22430 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72  ee objects inter
22440 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64  nal state to ind
22450 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77  icate that the w
22460 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rite.** transact
22470 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  ion has been clo
22480 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69  sed. This is qui
22490 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20  te safe, as the 
224a0 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a  pager will have.
224b0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20  ** transitioned 
224c0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  to the error sta
224d0 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  te..**.** This w
224e0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
224f0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
22500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22510 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
22520 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
22530 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
22540 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
22550 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
22560 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
22570 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c  aseTwo(Btree *p,
22580 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a   int bCleanup){.
22590 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
225a0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20  s==TRANS_NONE ) 
225b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
225c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
225d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
225e0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
225f0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
22600 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
22610 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
22620 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
22630 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
22640 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
22650 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
22660 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
22670 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
22680 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22690 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
226a0 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72  t rc;.    BtShar
226b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
226c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
226d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
226e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
226f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
22700 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
22710 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
22720 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
22730 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
22740 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
22750 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  !=SQLITE_OK && b
22760 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20  Cleanup==0 ){.  
22770 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22780 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
22790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
227a0 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72  .    p->iDataVer
227b0 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70  sion--;  /* Comp
227c0 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65  ensate for pPage
227d0 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
227e0 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69  +; */.    pBt->i
227f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
22800 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
22810 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
22820 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
22830 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
22840 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
22850 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
22860 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22870 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
22880 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
22890 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
228a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
228b0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
228c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
228d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
228e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
228f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
22900 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
22910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22920 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22930 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
22940 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
22950 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
22960 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
22970 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
22980 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
22990 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
229a0 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
229b0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
229c0 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
229d0 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61  very cursor on a
229e0 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74  ny BtShared that
229f0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
22a00 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68  ences.  Or if th
22a10 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
22a20 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68   is set to 1, th
22a30 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20  en only.** trip 
22a40 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e  write cursors an
22a50 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72  d leave read cur
22a60 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  sors unchanged..
22a70 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
22a80 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  or is a candidat
22a90 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c  e to be tripped,
22aa0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
22ab0 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e  rs.** that belon
22ac0 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  g to other datab
22ad0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
22ae0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
22af0 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65  e.** sharing the
22b00 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
22b10 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
22b20 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
22b30 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
22b40 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68  ck occurs. If th
22b50 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66  e writeOnly.** f
22b60 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
22b70 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72  n only write-cur
22b80 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69  sors need be tri
22b90 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79  pped - read-only
22ba0 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65  .** cursors save
22bb0 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70   their current p
22bc0 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  ositions so that
22bd0 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e   they may contin
22be0 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ue .** following
22bf0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f   the rollback. O
22c00 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  r, if writeOnly 
22c10 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75  is false, all cu
22c20 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72  rsors are .** tr
22c30 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61  ipped. In genera
22c40 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  l, writeOnly is 
22c50 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61  false if the tra
22c60 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a  nsaction being.*
22c70 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f  * rolled back mo
22c80 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
22c90 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74  ase schema. In t
22ca0 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20  his case b-tree 
22cb0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61  root.** pages ma
22cc0 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65  y be moved or de
22cd0 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
22ce0 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68  atabase altogeth
22cf0 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74  er, making.** it
22d00 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64   unsafe for read
22d10 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74   cursors to cont
22d20 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  inue..**.** If t
22d30 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
22d40 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e  g is true and an
22d50 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
22d60 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20  tered while .** 
22d70 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65  saving the curre
22d80 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61  nt position of a
22d90 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
22da0 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20  r, all cursors, 
22db0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  .** including al
22dc0 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61  l read-cursors a
22dd0 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a  re tripped..**.*
22de0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
22df0 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
22e00 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20  ssful, or if an 
22e10 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
22e20 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63  le.** saving a c
22e30 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20  ursor position, 
22e40 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
22e50 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
22e60 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
22e70 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
22e80 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
22e90 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
22ea0 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
22eb0 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
22ec0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
22ed0 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d  rt( (writeOnly==
22ee0 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  0 || writeOnly==
22ef0 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65  1) && BTCF_Write
22f00 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
22f10 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73   pBtree ){.    s
22f20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
22f30 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f  (pBtree);.    fo
22f40 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
22f50 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
22f60 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
22f70 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
22f80 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70   writeOnly && (p
22f90 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
22fa0 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
22fb0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22fc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22fd0 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
22fe0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
22ff0 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
23000 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
23010 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
23020 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23040 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
23050 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
23060 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65  llCursors(pBtree
23070 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  , rc, 0);.      
23080 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
230a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
230b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
230c0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
230d0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  p);.        p->e
230e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
230f0 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d  AULT;.        p-
23100 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
23110 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
23120 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
23130 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
23140 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
23150 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
23160 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50  ;.        p->apP
23170 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
23180 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
23190 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
231a0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
231b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
231c0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
231d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
231e0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  rogress..**.** I
231f0 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
23200 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e  t SQLITE_OK then
23210 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
23220 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72   invalidated (tr
23230 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20  ipped)..** Only 
23240 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
23250 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  e tripped if wri
23260 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62  teOnly is true b
23270 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  ut all cursors a
23280 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66  re.** tripped if
23290 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
232a0 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  lse.  Any attemp
232b0 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72  t to use.** a tr
232c0 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c  ipped cursor wil
232d0 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
232e0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
232f0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
23300 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
23310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23320 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
23330 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
23340 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
23350 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
23360 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
23370 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
23380 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
23390 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77   tripCode, int w
233a0 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  riteOnly){.  int
233b0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
233c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
233d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
233e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69  ;..  assert( wri
233f0 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69  teOnly==1 || wri
23400 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  teOnly==0 );.  a
23410 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d  ssert( tripCode=
23420 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  =SQLITE_ABORT_RO
23430 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f  LLBACK || tripCo
23440 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
23450 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
23460 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74  nter(p);.  if( t
23470 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
23480 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  OK ){.    rc = t
23490 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c  ripCode = saveAl
234a0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
234b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
234c0 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b  ) writeOnly = 0;
234d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
234e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
234f0 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
23500 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
23510 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  = sqlite3BtreeTr
23520 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
23530 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f  tripCode, writeO
23540 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nly);.    assert
23550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23560 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  || (writeOnly==0
23570 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   && rc2==SQLITE_
23580 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  OK) );.    if( r
23590 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
235a0 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
235b0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
235c0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
235d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
235e0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
235f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
23600 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
23610 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
23620 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
23630 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
23640 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
23650 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
23660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
23670 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
23680 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
23690 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
236a0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
236b0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
236c0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
236d0 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
236e0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
236f0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
23700 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
23710 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
23720 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
23730 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
23740 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
23750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23760 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
23770 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
23780 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
23790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
237a0 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
237b0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
237c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
237d0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
237e0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
237f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
23800 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
23810 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
23820 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
23830 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
23840 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
23850 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
23860 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20  lidCursors(pBt, 
23870 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  1)==0 );.    pBt
23880 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
23890 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
238a0 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
238b0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
238c0 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
238d0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
238e0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
238f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
23900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
23910 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
23920 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
23930 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
23940 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
23950 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
23960 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
23970 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
23980 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
23990 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
239a0 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
239b0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
239c0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
239d0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
239e0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
239f0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
23a00 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
23a10 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
23a20 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
23a30 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
23a40 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
23a50 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
23a60 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
23a70 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
23a80 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
23a90 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
23aa0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
23ab0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
23ac0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
23ad0 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
23ae0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
23af0 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
23b00 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
23b10 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
23b20 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
23b30 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
23b40 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
23b50 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
23b60 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
23b70 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
23b80 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
23b90 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
23ba0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
23bb0 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
23bc0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
23bd0 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
23be0 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
23bf0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
23c00 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
23c10 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
23c20 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
23c30 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
23c40 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
23c50 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
23c60 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
23c70 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
23c80 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
23c90 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
23ca0 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
23cb0 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
23cc0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
23cd0 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
23ce0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
23cf0 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
23d00 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
23d10 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
23d20 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
23d30 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
23d40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
23d50 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
23d60 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
23d70 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
23d80 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
23d90 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
23da0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61  _ONLY)==0 );.  a
23db0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
23dc0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
23dd0 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
23de0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
23df0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
23e00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
23e10 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
23e20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
23e30 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
23e40 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
23e50 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
23e60 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
23e70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
23e80 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
23e90 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
23ea0 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
23eb0 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
23ec0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
23ed0 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
23ee0 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
23ef0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
23f00 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
23f10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
23f20 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
23f30 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
23f40 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
23f50 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
23f60 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
23f70 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
23f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
23f90 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 42  c = btreePtrmapB
23fa0 65 67 69 6e 28 70 42 74 2c 20 69 53 74 61 74 65  egin(pBt, iState
23fb0 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ment);.  }.  sql
23fc0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23fd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
23ff0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
24000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
24010 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
24020 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
24030 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
24040 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
24050 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
24060 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
24070 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
24080 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
24090 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
240a0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
240b0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
240c0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
240d0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
240e0 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
240f0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
24100 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
24110 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
24120 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
24130 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
24140 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
24150 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
24160 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
24170 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
24180 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
24190 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
241a0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
241b0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
241c0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
241d0 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
241e0 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
241f0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
24200 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
24210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24220 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
24230 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
24240 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
24250 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24260 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
24270 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
24280 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
24290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
242a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
242b0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
242c0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
242d0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
242e0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
242f0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
24300 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
24310 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
24320 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
24330 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
24340 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
24350 20 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e 64    btreePtrmapEnd
24360 28 70 42 74 2c 20 6f 70 2c 20 69 53 61 76 65 70  (pBt, op, iSavep
24370 6f 69 6e 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  oint);.    rc = 
24380 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
24390 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
243a0 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
243b0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
243c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
243d0 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
243e0 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
243f0 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
24400 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
24410 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
24420 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
24430 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
24440 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
24450 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
24460 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
24470 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
24480 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
24490 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
244a0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
244b0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
244c0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
244d0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
244e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
244f0 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
24500 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
24510 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
24520 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
24530 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
24540 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
24550 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
24560 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
24570 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24580 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
24590 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
245a0 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
245b0 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
245c0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
245d0 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
245e0 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
245f0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
24600 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
24610 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
24620 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
24630 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
24640 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
24650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
24660 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
24670 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
24680 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
24690 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
246a0 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
246b0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
246c0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
246d0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
246e0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
246f0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
24700 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
24710 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
24720 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
24730 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
24740 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
24750 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
24760 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
24770 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
24780 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
24790 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
247a0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
247b0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
247c0 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
247d0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
247e0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
247f0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
24800 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
24810 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
24820 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
24830 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
24840 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
24850 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
24860 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
24870 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
24880 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
24890 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
248a0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
248b0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
248c0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
248d0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
248e0 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
248f0 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
24900 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
24910 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
24920 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
24930 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
24940 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
24950 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
24960 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
24970 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
24980 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
24990 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
249a0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
249b0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
249c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
249d0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
249e0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
249f0 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
24a00 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
24a10 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
24a20 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
24a30 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
24a40 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
24a50 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
24a60 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
24a70 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
24a80 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
24a90 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
24aa0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
24ab0 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
24ac0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
24ad0 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
24ae0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
24af0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
24b00 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
24b10 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
24b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b40 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
24b50 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
24b80 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
24b90 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
24ba0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
24bd0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24be0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24bf0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24c00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
24c10 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
24c20 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
24c30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24c60 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
24c70 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
24c80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ca0 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
24cb0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43   handle */.  BtC
24cc0 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20  ursor *pX;      
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f      /* Looping o
24cf0 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75  ver other all cu
24d00 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  rsors */..  asse
24d10 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
24d20 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
24d30 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24d40 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
24d50 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  1 );..  /* The f
24d60 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
24d70 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
24d80 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
24d90 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
24da0 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
24db0 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
24dc0 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
24dd0 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
24de0 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
24df0 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
24e00 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
24e10 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
24e20 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
24e30 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
24e40 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
24e50 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
24e60 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
24e70 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
24e80 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20  , wrFlag+1) );. 
24e90 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
24ea0 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
24eb0 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
24ec0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
24ed0 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
24ee0 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
24ef0 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
24f00 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
24f10 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
24f20 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
24f30 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24f40 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
24f50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
24f60 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
24f70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
24f80 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
24f90 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
24fa0 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46  =0 || (pBt->btsF
24fb0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
24fc0 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  ONLY)==0 );..  i
24fd0 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
24fe0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
24ff0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ce(pBt);.    if(
25000 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d   pBt->pTmpSpace=
25010 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
25020 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
25030 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
25040 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
25050 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
25060 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
25070 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
25080 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
25090 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
250a0 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
250b0 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
250c0 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
250d0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
250e0 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
250f0 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
25100 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
25110 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
25120 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
25130 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
25140 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
25150 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
25160 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
25170 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
25180 74 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72  t = pBt;.  asser
25190 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
251a0 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69  wrFlag==BTCF_Wri
251b0 74 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72  teFlag );.  pCur
251c0 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
251d0 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  lag;.  pCur->cur
251e0 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
251f0 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
25200 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
25210 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
25220 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
25230 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
25240 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
25250 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
25260 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
25270 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
25280 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
25290 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
252a0 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
252b0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
252c0 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
252d0 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
252e0 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
252f0 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
25300 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
25310 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
25320 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
25330 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
25340 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
25350 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
25360 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
25370 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
25380 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
25390 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
253a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
253b0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
253c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
253f0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
25400 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
25430 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
25440 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
25450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25470 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
25480 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
25490 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
254a0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
254c0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
254d0 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
254e0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
25510 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
25520 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
25530 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
25540 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
25550 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25560 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
25570 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
25580 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
25590 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
255a0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
255b0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
255c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
255d0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
255e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
255f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
25600 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
25610 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
25620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
25630 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
25640 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
25650 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
25660 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
25670 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
25680 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
25690 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
256a0 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
256b0 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
256c0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
256d0 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
256e0 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
256f0 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
25700 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
25710 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
25720 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
25730 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
25740 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
25750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
25760 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
25770 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
25780 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
25790 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
257a0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
257b0 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
257c0 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
257d0 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
257e0 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
257f0 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
25800 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
25810 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
25820 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
25830 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
25840 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
25850 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
25860 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
25870 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
25880 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
25890 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
258a0 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
258b0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
258c0 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
258d0 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
258e0 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
258f0 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
25900 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
25910 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
25920 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
25930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25940 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
25950 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
25960 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
25970 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25980 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
25990 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
259a0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
259b0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
259c0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
259d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
259e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
259f0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
25a00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25a10 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
25a20 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
25a30 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61  sor(pCur);.    a
25a40 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
25a50 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  sor!=0 );.    if
25a60 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
25a70 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42  pCur ){.      pB
25a80 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
25a90 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
25aa0 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72  lse{.      BtCur
25ab0 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74  sor *pPrev = pBt
25ac0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->pCursor;.     
25ad0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
25ae0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70   pPrev->pNext==p
25af0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
25b00 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
25b10 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
25b20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
25b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25b40 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70  pPrev = pPrev->p
25b50 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69  Next;.      }whi
25b60 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76  le( ALWAYS(pPrev
25b70 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) );.    }.    f
25b80 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
25b90 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
25ba0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25bb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
25bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
25bd0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
25be0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
25bf0 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
25c00 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20  erflow);.    /* 
25c10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
25c20 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
25c30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
25c40 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
25c50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25c60 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
25c70 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
25c80 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
25c90 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
25ca0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
25cb0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
25cc0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
25cd0 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
25ce0 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
25cf0 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
25d00 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
25d10 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
25d20 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
25d30 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
25d40 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
25d50 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
25d60 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
25d70 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
25d80 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
25d90 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
25da0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
25db0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
25dc0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25dd0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
25de0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
25df0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
25e00 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
25e10 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
25e20 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
25e30 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
25e40 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
25e50 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
25e60 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
25e70 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
25e80 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
25e90 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
25ea0 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
25eb0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
25ec0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
25ed0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
25ee0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
25ef0 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
25f00 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
25f10 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
25f20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
25f30 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
25f40 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
25f50 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
25f60 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
25f70 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61  Key;.    btreePa
25f80 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
25f90 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
25fa0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
25fb0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
25fc0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
25fd0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
25fe0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
25ff0 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
26000 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
26010 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
26020 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
26030 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
26040 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
26050 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
26060 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
26070 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
26080 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
26090 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
260a0 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
260b0 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
260c0 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
260d0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
260e0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
260f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
26100 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
26110 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
26120 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
26130 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
26140 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
26150 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
26160 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
26170 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
26180 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
26190 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
261a0 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
261b0 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
261c0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
261d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
261e0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
261f0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
26200 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
26210 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
26220 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
26230 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
26240 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
26250 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
26260 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
26270 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
26280 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
26290 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
262a0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
262b0 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
262c0 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
262d0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
262e0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
262f0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
26300 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
26310 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
26320 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
26330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
26340 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
26350 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
26360 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
26370 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26380 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26390 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
263a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
263b0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
263c0 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
263d0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
263e0 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53  nKey;.  return S
263f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26400 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
26410 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
26420 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
26430 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
26440 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
26450 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
26460 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
26470 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
26480 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
26490 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
264a0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
264b0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
264c0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
264d0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
264e0 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
264f0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
26500 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
26510 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
26520 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
26530 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
26540 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26550 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
26560 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
26570 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
26580 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
26590 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
265a0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
265b0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
265c0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
265d0 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
265e0 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
265f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
26600 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
26610 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
26620 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
26630 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
26640 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
26650 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
26660 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
26670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26680 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
26690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
266a0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
266b0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
266c0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
266d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
266e0 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b  intKeyLeaf==1 );
266f0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
26700 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
26710 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
26720 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
26730 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26740 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
26750 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
26760 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
26770 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
26780 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
26790 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
267a0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
267b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
267c0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
267d0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
267e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
267f0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
26800 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
26810 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
26820 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
26830 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
26840 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
26850 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
26860 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
26870 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
26880 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
26890 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
268a0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
268b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
268c0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
268d0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
268e0 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
268f0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
26900 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
26910 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
26920 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
26930 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
26940 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
26950 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
26960 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
26970 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
26980 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
26990 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
269a0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
269b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
269c0 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
269d0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
269e0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
269f0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
26a00 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
26a10 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
26a20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
26a30 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
26a40 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
26a50 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
26a60 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
26a70 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
26a80 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
26a90 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
26aa0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
26ab0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
26ac0 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
26ad0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
26ae0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
26af0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
26b00 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
26b10 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
26b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26b30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26b40 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
26b70 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
26b80 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
26b90 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
26ba0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
26bb0 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
26bc0 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
26bd0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
26be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26bf0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
26c00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
26c10 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
26c20 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
26c30 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
26c40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26c50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26c60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
26c70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
26c80 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
26c90 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
26ca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26cb0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
26cc0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
26cd0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
26ce0 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
26cf0 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
26d00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
26d10 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
26d20 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
26d30 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
26d40 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
26d50 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
26d60 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
26d70 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
26d80 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
26d90 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
26da0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
26db0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
26dc0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
26dd0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
26de0 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
26df0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26e00 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
26e10 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
26e20 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
26e30 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
26e40 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
26e50 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
26e60 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
26e70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26e80 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
26e90 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
26ea0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
26eb0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
26ec0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
26ed0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
26ee0 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
26ef0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
26f00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26f10 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
26f20 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
26f30 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
26f40 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
26f50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
26f60 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
26f70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
26f80 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
26f90 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
26fa0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
26fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26fc0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
26fd0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
26fe0 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
26ff0 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
27000 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
27010 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
27020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
27030 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
27040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
27060 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
27070 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
27080 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
27090 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
270a0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
270b0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
270c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
270d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
270e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
270f0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
27100 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
27110 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
27120 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
27130 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
27140 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
27150 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
27160 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
27170 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
27180 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
27190 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
271a0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
271b0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
271c0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
271d0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
271e0 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
271f0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
27200 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
27210 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
27220 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
27230 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
27240 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
27250 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
27260 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
27270 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
27280 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
27290 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
272a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
272b0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
272c0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
272d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
272e0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
272f0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
27300 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
27310 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
27320 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
27330 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
27340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27350 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
27360 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
27370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
27390 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
273a0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
273b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
273c0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
273d0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
273e0 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
273f0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
27400 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
27410 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
27420 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
27430 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
27440 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
27450 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
27460 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
27470 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
27480 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
27490 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
274a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
274b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
274c0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
274d0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
274e0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
274f0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
27500 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
27510 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
27520 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
27530 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
27540 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
27550 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
27560 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27570 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27580 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
27590 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
275a0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
275b0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
275c0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
275d0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
275e0 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
275f0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
27600 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
27610 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
27620 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
27630 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
27640 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
27650 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
27660 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
27670 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
27680 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
27690 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
276a0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
276b0 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
276c0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
276d0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
276e0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
276f0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
27700 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
27710 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
27720 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
27730 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
27740 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
27750 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
27760 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
27770 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
27780 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
27790 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
277a0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
277b0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
277c0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
277d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
277e0 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
277f0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
27800 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
27810 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
27820 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
27830 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
27840 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
27850 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
27860 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
27870 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27880 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
27890 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
278a0 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
278b0 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
278c0 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
278d0 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
278e0 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
278f0 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
27900 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
27910 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
27920 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
27930 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
27940 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
27950 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
27960 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
27970 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
27980 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
27990 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
279a0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
279b0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
279c0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
279d0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
279e0 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
279f0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
27a00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27a10 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
27a20 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
27a30 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
27a40 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
27a50 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
27a60 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
27a70 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
27a80 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
27a90 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
27aa0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
27ab0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
27ac0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
27ad0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
27ae0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
27af0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
27b00 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
27b10 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
27b20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
27b30 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
27b40 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
27b50 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
27b60 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
27b70 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
27b80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
27b90 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
27ba0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
27bb0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
27bc0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
27bd0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
27be0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
27bf0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
27c00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
27c10 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
27c20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27c30 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
27c40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
27c50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27c60 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
27c70 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
27c80 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
27c90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27ca0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
27cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
27cc0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
27cd0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
27ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27cf0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27d00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27d10 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
27d20 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
27d30 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
27d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
27d60 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
27d70 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
27d80 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
27d90 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
27da0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27db0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
27dc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27dd0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27de0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
27df0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
27e00 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27e10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27e20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
27e30 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
27e40 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
27e50 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
27e60 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
27e70 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
27e80 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
27e90 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
27ea0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
27eb0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
27ec0 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
27ed0 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
27ee0 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
27ef0 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
27f00 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
27f10 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
27f20 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c 6f  ;..  if( &aPaylo
27f30 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
27f40 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
27f50 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
27f60 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a  eSize] ){.    /*
27f70 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
27f80 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
27f90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
27fa0 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
27fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27fc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27fd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
27fe0 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
27ff0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
28000 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
28010 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
28020 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
28030 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
28040 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
28050 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
28060 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
28070 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
28080 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
28090 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
280a0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
280b0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
280c0 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
280d0 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30  f, a, (eOp & 0x0
280e0 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  1), pPage->pDbPa
280f0 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
28100 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
28110 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
28120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
28130 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
28140 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
28150 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
28160 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
28170 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
28180 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
28190 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
281a0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
281b0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
281c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
281d0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
281e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
281f0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
28200 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
28210 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
28220 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
28230 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
28240 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
28250 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
28260 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
28270 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
28280 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
28290 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
282a0 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
282b0 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
282c0 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
282d0 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
282e0 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
282f0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
28300 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
28310 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
28320 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
28330 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
28340 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
28350 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
28360 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
28370 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
28380 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
28390 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
283a0 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
283b0 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
283c0 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
283d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
283e0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
283f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
28400 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
28410 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
28420 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28430 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
28440 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
28450 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
28460 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
28470 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
28480 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
28490 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
284a0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
284b0 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
284c0 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
284d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
284e0 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
284f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28500 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
28510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28520 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f   pCur->nOvflAllo
28530 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20  c = nOvfl*2;.   
28540 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
28550 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20  erflow = aNew;. 
28560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28570 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28590 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d      memset(pCur-
285a0 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e  >aOverflow, 0, n
285b0 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  Ovfl*sizeof(Pgno
285c0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  ));.        pCur
285d0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
285e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
285f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
28600 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
28610 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
28620 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
28630 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
28640 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
28650 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
28660 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
28670 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
28680 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
28690 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
286a0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
286b0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
286c0 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20  idOvfl)!=0.     
286d0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
286e0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
286f0 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze].    ){.     
28700 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
28710 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
28720 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
28730 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
28740 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
28750 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
28760 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ze);.    }..    
28770 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
28780 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
28790 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
287a0 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  +){..      /* If
287b0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
287c0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
287d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
287e0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
287f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28800 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
28810 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
28820 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
28830 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
28840 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
28850 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
28860 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
28870 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
28880 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
28890 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f    }..      if( o
288a0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
288b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
288c0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
288d0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
288e0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
288f0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
28900 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
28910 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
28920 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
28930 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
28940 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
28950 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
28960 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
28970 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
28980 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
28990 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
289a0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
289b0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
289c0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
289d0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
289e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
289f0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
28a00 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
28a10 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c  array must be al
28a20 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20  located because 
28a30 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a  eOp!=2.        *
28a40 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d  * here.  If eOp=
28a50 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d  =2, then offset=
28a60 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e  =0 and this bran
28a70 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65  ch is never take
28a80 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
28a90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
28aa0 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  p!=2 );.        
28ab0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
28ac0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
28ad0 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20  lidOvfl );.     
28ae0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28af0 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74  >pBtree->db==pBt
28b00 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20  ->db );.        
28b10 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
28b20 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
28b30 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
28b40 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
28b50 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
28b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28b70 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
28b80 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
28b90 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
28ba0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
28bb0 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65   }.        offse
28bc0 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
28bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28be0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
28bf0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
28c00 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
28c10 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
28c20 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
28c30 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
28c40 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
28c50 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
28c60 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
28c70 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
28c80 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
28c90 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
28ca0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
28cb0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
28cc0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
28cd0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
28ce0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
28cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
28d00 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
28d10 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
28d20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
28d30 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
28d40 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
28d50 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
28d60 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
28d70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28d80 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
28d90 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
28da0 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
28db0 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
28dc0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
28dd0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
28de0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
28df0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
28e00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28e10 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
28e20 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
28e30 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  ) there is no op
28e40 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  en write-transac
28e50 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
28e60 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61    **   5) the da
28e70 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20  tabase is not a 
28e80 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20  WAL database,.  
28e90 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c        **   6) al
28ea0 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
28eb0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 65  page is being re
28ec0 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ad..        **  
28ed0 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20 62   7) at least 4 b
28ee0 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ytes have alread
28ef0 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f  y been read into
28f00 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
28f10 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  er .        **. 
28f20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
28f30 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20  ata can be read 
28f40 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
28f50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28f60 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
28f70 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65   ** output buffe
28f80 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  r, bypassing the
28f90 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f   page-cache alto
28fa0 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65  gether. This spe
28fb0 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  eds.        ** u
28fc0 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20  p loading large 
28fd0 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61  records that spa
28fe0 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  n many overflow 
28ff0 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  pages..        *
29000 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  /.        if( (e
29010 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20  Op&0x01)==0     
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
29050 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30      && offset==0
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
29090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
290a0 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c  (bEnd || a==ovfl
290b0 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20 20  Size)           
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290d0 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
290e0 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e        && pBt->in
290f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
29100 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  NS_READ         
29110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
29120 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  4) */.         &
29130 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50  & (fd = sqlite3P
29140 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
29150 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73  ager))->pMethods
29160 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
29170 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
29180 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39  pPage1->aData[19
29190 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20  ]==0x01         
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
291b0 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (5) */.        
291c0 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70   && &pBuf[-4]>=p
291d0 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20  BufStart        
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f         /* (7) */
29200 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
29210 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
29220 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
29230 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
29240 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -4];.          a
29250 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70  ssert( aWrite>=p
29260 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20  BufStart );     
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29      /* hence (7)
29290 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
292a0 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
292b0 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
292c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
292d0 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
292e0 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
292f0 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
29300 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
29310 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
29320 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
29330 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29340 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
29350 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
29360 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
29370 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
29380 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
29390 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
293a0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
293b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
293c0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
293d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
293e0 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f  ((eOp&0x01)==0 ?
293f0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
29400 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
29410 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
29420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29440 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
29450 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
29460 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
29470 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
29480 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
29490 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
294a0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
294b0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
294c0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
294d0 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50  (eOp&0x01), pDbP
294e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
294f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
29500 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
29510 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
29520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29530 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29540 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
29550 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
29560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29570 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
29580 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
29590 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
295a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
295b0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
295c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
295d0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
295e0 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
295f0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
29600 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
29610 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
29620 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f  transferred into
29630 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
29640 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
29650 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
29660 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
29670 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
29680 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
29690 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a   to a valid row.
296a0 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ** in the table.
296b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
296c0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
296d0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
296e0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
296f0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
29700 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
29710 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
29720 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
29730 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
29740 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
29750 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29760 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
29770 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
29780 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
29790 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
297a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
297b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
297c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
297d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
297e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
297f0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
29800 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29810 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
29820 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
29830 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
29840 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29850 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
29860 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
29870 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
29880 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
29890 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
298a0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
298b0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
298c0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
298d0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
298e0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
298f0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
29900 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
29910 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
29920 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
29930 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
29940 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
29950 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
29960 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
29970 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
29980 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
29990 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
299a0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
299b0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
299c0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
299d0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
299e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
299f0 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
29a00 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
29a10 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
29a20 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
29a30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29a40 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
29a50 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
29a60 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
29a70 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
29a80 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
29a90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
29aa0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29ab0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29ac0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
29ad0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
29ae0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
29af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
29b00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29b10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29b20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29b30 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
29b40 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
29b50 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
29b60 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29b70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29b80 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
29b90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
29ba0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
29bb0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29bc0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29bd0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
29be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29bf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
29c00 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
29c10 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
29c20 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
29c30 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
29c40 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
29c50 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
29c60 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
29c70 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
29c80 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
29c90 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
29ca0 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
29cb0 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
29cc0 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
29cd0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
29ce0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
29cf0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
29d00 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
29d10 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
29d20 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
29d30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
29d40 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
29d50 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
29d60 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
29d70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
29d80 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
29d90 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
29da0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
29db0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
29dc0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
29dd0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
29de0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
29df0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
29e00 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
29e10 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
29e20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
29e30 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
29e40 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
29e50 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
29e60 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
29e70 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
29e80 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
29e90 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
29ea0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
29eb0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
29ec0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
29ed0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
29ee0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
29ef0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
29f00 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
29f10 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
29f20 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
29f30 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
29f40 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
29f50 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
29f60 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
29f70 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
29f80 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
29f90 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
29fa0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
29fb0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29fc0 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
29fd0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
29fe0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
29ff0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
2a000 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
2a010 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
2a020 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
2a030 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
2a040 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
2a050 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
2a060 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
2a070 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
2a080 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
2a090 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
2a0a0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
2a0b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a0c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a0d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2a0e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2a0f0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2a100 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2a110 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2a120 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2a130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a140 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a150 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2a160 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a170 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
2a180 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2a190 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Size>0 );.  asse
2a1a0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
2a1b0 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70  Payload>pCur->ap
2a1c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a1d0 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52  ]->aData || CORR
2a1e0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
2a1f0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
2a200 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70  Payload<pCur->ap
2a210 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a220 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f  ]->aDataEnd ||CO
2a230 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74  RRUPT_DB);.  amt
2a240 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61   = (int)(pCur->a
2a250 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a260 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  e]->aDataEnd - p
2a270 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2a280 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ad);.  if( pCur-
2a290 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74  >info.nLocal<amt
2a2a0 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69   ) amt = pCur->i
2a2b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70  nfo.nLocal;.  *p
2a2c0 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74  Amt = amt;.  ret
2a2d0 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
2a2e0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
2a2f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
2a300 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
2a310 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
2a320 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
2a330 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
2a340 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
2a350 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
2a360 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
2a370 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2a380 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
2a390 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
2a3a0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
2a3b0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
2a3c0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
2a3d0 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
2a3e0 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
2a3f0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
2a400 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
2a410 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
2a420 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
2a430 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
2a440 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
2a450 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
2a460 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
2a470 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
2a480 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
2a490 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
2a4a0 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
2a4b0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
2a4c0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
2a4d0 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
2a4e0 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
2a4f0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
2a500 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
2a510 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
2a520 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
2a530 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
2a540 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
2a550 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
2a560 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
2a570 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
2a580 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
2a590 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76  pAmt);.}.const v
2a5a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
2a5b0 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
2a5c0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
2a5d0 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
2a5e0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
2a5f0 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
2a600 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a610 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
2a620 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
2a630 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
2a640 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
2a650 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2a660 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
2a670 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
2a680 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2a690 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
2a6a0 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
2a6b0 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
2a6c0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
2a6d0 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
2a6e0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
2a6f0 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
2a700 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
2a710 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
2a720 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
2a730 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
2a740 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
2a750 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
2a760 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
2a770 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
2a780 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2a790 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42  32 newPgno){.  B
2a7a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2a7b0 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
2a7c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2a7d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2a7e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a7f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a800 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2a810 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
2a820 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
2a830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a840 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
2a850 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2a860 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
2a870 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
2a880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2a890 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2a8a0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2a8b0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2a8c0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2a8d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2a8e0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2a8f0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20  pCur->iPage++;. 
2a900 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2a910 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20  r->iPage] = 0;. 
2a920 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
2a930 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
2a940 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  gno, &pCur->apPa
2a950 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  ge[pCur->iPage],
2a960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a970 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20 70           pCur, p
2a980 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
2a990 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  gs);.}..#if SQLI
2a9a0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
2a9b0 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
2a9c0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
2a9d0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
2a9e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
2a9f0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
2aa00 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
2aa10 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
2aa20 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
2aa30 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
2aa40 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
2aa50 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
2aa60 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
2aa70 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
2aa80 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
2aa90 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
2aaa0 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
2aab0 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
2aac0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
2aad0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
2aae0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
2aaf0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
2ab00 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
2ab10 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50  d){.  if( CORRUP
2ab20 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20  T_DB ) return;  
2ab30 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2ab40 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d  s tested below m
2ab50 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65  ight not be true
2ab60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2ab80 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
2ab90 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  abase */.  asser
2aba0 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
2abb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
2abc0 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
2abd0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
2abe0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
2abf0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2ac00 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2ac10 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
2ac20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2ac30 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
2ac40 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2ac50 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
2ac60 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
2ac70 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
2ac80 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
2ac90 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
2aca0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2acb0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
2acc0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
2acd0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2ace0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
2acf0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2ad00 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
2ad10 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
2ad20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
2ad30 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
2ad40 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
2ad50 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
2ad60 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
2ad70 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
2ad80 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
2ad90 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
2ada0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
2adb0 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
2adc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2add0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2ade0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2adf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ae00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ae10 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2ae20 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2ae30 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
2ae40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ae50 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
2ae60 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
2ae70 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
2ae80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2ae90 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
2aea0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2aeb0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
2aec0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2aed0 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
2aee0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
2aef0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2af00 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
2af10 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2af20 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  -1]->nCell );.  
2af30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2af40 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2af50 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2af60 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2af70 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
2af80 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2af90 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
2afa0 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d  ur->iPage--]);.}
2afb0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2afc0 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
2afd0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
2afe0 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
2aff0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2b000 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2b010 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
2b020 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
2b030 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
2b040 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
2b050 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
2b060 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
2b070 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
2b080 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
2b090 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
2b0a0 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
2b0b0 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2b0c0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
2b0d0 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
2b0e0 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
2b0f0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2b100 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
2b110 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
2b120 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
2b130 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
2b140 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
2b150 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2b160 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
2b170 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
2b180 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
2b190 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
2b1a0 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
2b1b0 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
2b1c0 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
2b1d0 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
2b1e0 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
2b1f0 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
2b200 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
2b210 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
2b220 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2b230 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
2b240 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
2b250 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
2b260 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
2b270 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
2b280 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
2b290 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
2b2a0 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
2b2b0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
2b2c0 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
2b2d0 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
2b2e0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
2b2f0 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
2b300 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
2b310 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
2b320 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
2b330 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
2b340 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
2b350 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
2b360 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
2b370 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
2b380 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
2b390 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
2b3a0 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
2b3b0 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
2b3c0 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
2b3d0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
2b3e0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
2b3f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b400 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
2b410 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b420 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2b430 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2b440 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2b450 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
2b460 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
2b470 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2b480 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
2b490 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
2b4a0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2b4b0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
2b4c0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
2b4d0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2b4e0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2b4f0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2b500 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
2b510 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2b520 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2b530 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2b540 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
2b550 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
2b560 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2b570 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2b580 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2b590 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2b5a0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
2b5b0 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
2b5c0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61  while( pCur->iPa
2b5d0 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ge ){.      asse
2b5e0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2b5f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30  [pCur->iPage]!=0
2b600 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   );.      releas
2b610 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
2b620 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b630 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d  iPage--]);.    }
2b640 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
2b650 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
2b660 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2b670 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2b680 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
2b690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2b6a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2b6b0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
2b6c0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ) );.    rc = ge
2b6d0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
2b6e0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
2b6f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2b700 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
2b710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b720 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
2b730 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2b740 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b760 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b770 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b780 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2b7a0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->iPage = 0;.   
2b7b0 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2b7c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2b7d0 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a  0]->intKey;.  }.
2b7e0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
2b7f0 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
2b800 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
2b810 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
2b820 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
2b830 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
2b840 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2b850 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
2b860 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
2b870 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
2b880 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
2b890 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
2b8a0 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
2b8b0 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
2b8c0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
2b8d0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
2b8e0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
2b8f0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
2b900 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
2b910 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
2b920 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
2b930 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
2b940 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
2b950 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
2b960 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
2b970 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
2b980 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
2b990 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
2b9a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
2b9b0 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
2b9c0 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
2b9d0 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
2b9e0 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
2b9f0 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
2ba00 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
2ba10 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
2ba20 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
2ba30 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
2ba40 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
2ba50 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
2ba60 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
2ba70 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
2ba80 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
2ba90 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
2baa0 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
2bab0 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
2bac0 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
2bad0 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
2bae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2baf0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2bb00 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  }..  pCur->aiIdx
2bb10 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
2bb20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2bb30 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2bb40 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
2bb50 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  st|BTCF_ValidNKe
2bb60 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2bb70 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  );..  if( pRoot-
2bb80 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2bb90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2bba0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2bbb0 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2bbc0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2bbd0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2bbe0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2bbf0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2bc00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2bc10 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2bc20 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2bc30 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2bc40 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2bc50 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2bc60 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2bc70 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2bc80 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2bc90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2bca0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2bcb0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d  SOR_INVALID;.  }
2bcc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bcd0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2bce0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2bcf0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2bd00 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2bd10 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
2bd20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2bd30 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
2bd40 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
2bd50 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
2bd60 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
2bd70 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
2bd80 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
2bd90 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
2bda0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2bdb0 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
2bdc0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2bdd0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2bde0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2bdf0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2be00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2be10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2be20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2be30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2be40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2be50 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2be60 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
2be70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2be80 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
2be90 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
2bea0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2beb0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
2bec0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
2bed0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
2bee0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
2bef0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2bf00 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
2bf10 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2bf20 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
2bf30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2bf40 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2bf50 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
2bf60 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
2bf70 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2bf80 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
2bf90 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
2bfa0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
2bfb0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
2bfc0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
2bfd0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2bfe0 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
2bff0 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
2c000 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
2c010 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
2c020 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
2c030 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
2c040 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
2c050 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2c060 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2c070 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
2c080 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
2c090 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2c0a0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
2c0b0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
2c0c0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
2c0d0 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
2c0e0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2c0f0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
2c100 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
2c110 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2c120 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2c130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2c140 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2c150 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2c160 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2c170 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2c180 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c190 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2c1a0 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
2c1b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2c1c0 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
2c1d0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
2c1e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2c1f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2c200 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2c210 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c220 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
2c230 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
2c240 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2c250 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
2c260 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2c270 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
2c280 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c290 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
2c2a0 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l-1;.  assert( p
2c2b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2c2c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c2d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2c2e0 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
2c2f0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2c300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2c310 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2c320 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
2c330 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2c340 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2c350 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2c360 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2c370 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2c380 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2c390 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2c3a0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2c3b0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2c3c0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2c3d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
2c3e0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
2c3f0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2c400 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
2c410 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2c420 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2c430 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c440 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2c450 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2c460 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
2c470 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2c480 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2c4a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c4b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
2c4c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2c4d0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2c4e0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2c4f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2c500 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
2c510 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
2c520 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2c530 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2c540 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2c550 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
2c560 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2c570 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
2c580 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2c590 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2c5a0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2c5b0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2c5c0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2c5d0 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2c5e0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
2c5f0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
2c600 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
2c610 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
2c620 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
2c630 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
2c640 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
2c650 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2c660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c670 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
2c680 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2c690 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2c6a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2c6b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2c6c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c6d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c6e0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2c6f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2c700 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2c710 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2c720 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2c730 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2c740 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2c750 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2c760 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2c770 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2c780 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2c790 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2c7a0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2c7b0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2c7c0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2c7d0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2c7e0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2c7f0 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2c800 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2c810 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2c820 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2c830 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2c840 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2c850 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2c860 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2c870 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2c880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2c890 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2c8a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
2c8b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c8c0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2c8d0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2c8e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2c8f0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2c900 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2c910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c920 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2c930 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2c940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c950 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2c960 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2c970 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2c980 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c990 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2c9a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2c9b0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2c9c0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2c9d0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2c9e0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2c9f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ca00 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2ca10 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2ca20 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2ca30 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2ca40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2ca50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ca60 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2ca70 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2ca80 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2ca90 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2caa0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2cab0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2cac0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2cad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cae0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2caf0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2cb00 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2cb10 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2cb20 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2cb30 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2cb40 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2cb50 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2cb60 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2cb70 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2cb80 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2cb90 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2cba0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2cbb0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2cbc0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2cbd0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2cbe0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2cbf0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2cc00 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2cc10 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2cc20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2cc30 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2cc40 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2cc50 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2cc60 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2cc70 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2cc80 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2cc90 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2cca0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2ccb0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2ccc0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2ccd0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2cce0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2ccf0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2cd00 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2cd10 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2cd20 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2cd30 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2cd40 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2cd50 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2cd60 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2cd70 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2cd80 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2cd90 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2cda0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2cdb0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2cdc0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2cdd0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2cde0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2cdf0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2ce00 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2ce10 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2ce20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2ce30 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2ce40 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2ce50 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2ce60 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2ce70 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2ce80 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2ce90 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2cea0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2cec0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2ced0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2cee0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2cef0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2cf00 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2cf10 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2cf20 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2cf30 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2cf40 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2cf50 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
2cf60 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2cf70 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
2cf80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2cf90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
2cfa0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
2cfb0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
2cfc0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
2cfd0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
2cfe0 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
2cff0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
2d000 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
2d010 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
2d020 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
2d030 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
2d040 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
2d050 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
2d060 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
2d070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2d080 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
2d090 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
2d0a0 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64  int rc;.  Record
2d0b0 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43  Compare xRecordC
2d0c0 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72  ompare;..  asser
2d0d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2d0e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2d0f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d100 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2d110 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2d120 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2d130 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
2d140 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
2d150 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2d160 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
2d170 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2d180 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
2d190 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
2d1a0 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
2d1b0 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
2d1c0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
2d1d0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
2d1e0 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
2d1f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d200 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
2d210 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d220 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
2d230 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 63 75 72  .   && pCur->cur
2d240 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  IntKey .  ){.   
2d250 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2d260 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2d270 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2d280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d290 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2d2a0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2d2b0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2d2c0 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72  Last)!=0 && pCur
2d2d0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2d2e0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2d2f0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
2d300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d310 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2d320 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
2d330 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2d340 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
2d350 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
2d360 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
2d370 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
2d380 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
2d390 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
2d3a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2d3b0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2d3c0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
2d3d0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2d3e0 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
2d3f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
2d400 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
2d410 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
2d420 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
2d430 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2d440 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2d450 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2d460 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2d470 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2d480 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2d490 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2d4a0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
2d4b0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2d4c0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2d4d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
2d4e0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
2d4f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2d500 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2d510 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2d520 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2d530 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
2d540 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2d550 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2d560 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2d570 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2d580 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2d590 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d5a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2d5b0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
2d5c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2d5d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d5e0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2d5f0 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
2d600 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2d610 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2d620 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
2d630 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
2d640 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
2d650 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
2d660 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
2d670 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2d680 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d690 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  ge];.    u8 *pCe
2d6a0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d6c0 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
2d6d0 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
2d6e0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
2d6f0 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
2d700 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2d710 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
2d720 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
2d730 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
2d740 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
2d750 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
2d760 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
2d770 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
2d780 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
2d790 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
2d7a0 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
2d7b0 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
2d7c0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
2d7d0 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
2d7e0 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
2d7f0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
2d800 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
2d810 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
2d820 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
2d830 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
2d840 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
2d850 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
2d860 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
2d870 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
2d880 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
2d890 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2d8a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d8b0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
2d8c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2d8d0 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
2d8e0 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
2d8f0 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
2d900 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
2d910 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
2d920 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
2d930 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
2d940 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
2d950 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
2d960 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
2d970 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2d980 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2d990 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2d9a0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
2d9b0 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
2d9c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2d9d0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
2d9e0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
2d9f0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2da00 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2da10 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
2da20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2da30 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
2da40 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
2da50 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
2da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2da70 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
2da80 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e  DataEnd ) return
2da90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2daa0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2dab0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2dac0 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
2dad0 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
2dae0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
2daf0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
2db00 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2db10 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2db20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2db30 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
2db40 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2db50 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
2db60 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
2db70 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2db80 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2db90 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2dba0 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
2dbb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2dbc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2dbd0 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
2dbe0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2dbf0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2dc00 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2dc10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2dc20 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2dc30 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
2dc40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2dc50 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2dc60 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
2dc70 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2dc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
2dc90 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
2dca0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2dcb0 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
2dcc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2dcd0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2dce0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2dcf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2dd10 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2dd20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dd30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2dd40 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2dd50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2dd60 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2dd70 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2dd80 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
2dd90 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2dda0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2ddb0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20      int nCell;  
2ddc0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
2ddd0 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74  Cell cell in byt
2dde0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  es */.        pC
2ddf0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2de00 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2de10 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
2de20 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
2de30 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
2de40 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
2de50 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
2de60 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
2de70 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2de80 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
2de90 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
2dea0 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
2deb0 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
2dec0 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
2ded0 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
2dee0 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
2def0 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
2df00 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2df10 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
2df20 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
2df30 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
2df40 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
2df50 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
2df60 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
2df70 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
2df80 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2df90 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
2dfa0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
2dfb0 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
2dfc0 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
2dfd0 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
2dfe0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
2dff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
2e000 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
2e010 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2e020 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
2e030 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
2e040 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2e050 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
2e060 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2e070 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
2e080 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
2e090 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
2e0a0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2e0b0 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
2e0c0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
2e0d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
2e0e0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2e0f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2e100 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
2e110 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2e120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2e130 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2e140 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2e150 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
2e160 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e170 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
2e180 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
2e190 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
2e1a0 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
2e1b0 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
2e1c0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
2e1d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2e1e0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2e1f0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
2e200 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
2e210 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
2e220 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
2e230 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2e240 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
2e250 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2e260 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2e270 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
2e280 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2e290 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2e2a0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2e2b0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
2e2c0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2e2d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e2e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2e2f0 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
2e300 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
2e310 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2e320 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
2e330 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
2e340 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
2e350 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
2e360 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
2e370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2e380 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2e390 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
2e3a0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
2e3b0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
2e3c0 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
2e3d0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
2e3e0 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
2e3f0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ed. .          *
2e400 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2e410 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2e420 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65  corrupt, the xRe
2e430 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74  cordCompare rout
2e440 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20  ine may read.   
2e450 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20         ** up to 
2e460 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
2e470 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2e480 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61  buffer. An extra
2e490 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a   18 .          *
2e4a0 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  * bytes of paddi
2e4b0 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ng is allocated 
2e4c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2e4d0 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20  e buffer in.    
2e4e0 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
2e4f0 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a  is happens.  */.
2e500 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
2e510 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
2e520 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
2e530 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
2e540 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
2e550 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
2e560 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
2e570 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2e580 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
2e590 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
2e5a0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
2e5b0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
2e5c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e5d0 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20  nCell<0 );   /* 
2e5e0 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65  True if key size
2e5f0 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65   is 2^32 or more
2e600 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2e610 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30  stcase( nCell==0
2e620 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2e630 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2e640 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20  0x80 0x00 */.   
2e650 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2e660 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a   nCell==1 );  /*
2e670 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2e680 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2e690 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  01 */.          
2e6a0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2e6b0 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =2 );  /* Minimu
2e6c0 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65  m legal index ke
2e6d0 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  y size */.      
2e6e0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20      if( nCell<2 
2e6f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2e700 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2e710 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2e720 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2e730 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2e740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2e750 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2e760 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
2e770 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
2e780 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
2e790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2e7a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2e7c0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2e7d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e7e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2e7f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2e800 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2e810 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
2e820 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
2e830 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
2e840 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
2e850 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
2e860 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2e880 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2e890 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e8a0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e8b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e8c0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2e8d0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2e8e0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2e8f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2e900 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2e910 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2e920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2e930 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2e940 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2e950 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2e960 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2e970 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2e980 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2e990 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2e9a0 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2e9b0 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2e9c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2e9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2e9e0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2e9f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2ea00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2ea10 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2ea20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ea30 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2ea40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2ea50 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2ea60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ea70 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2ea80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2ea90 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2eaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2eab0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2eac0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2ead0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2eae0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2eaf0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2eb00 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2eb10 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2eb20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2eb30 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2eb40 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2eb50 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2eb60 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2eb70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2eb80 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2eb90 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2eba0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2ebb0 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2ebc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2ebd0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2ebe0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ebf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ec00 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2ec10 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2ec20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2ec30 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2ec40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ec50 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2ec60 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2ec70 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2ec80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ec90 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2eca0 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2ecb0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2ecc0 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2ecd0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2ece0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2ecf0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2ed00 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ed10 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2ed20 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2ed30 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2ed40 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2ed50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2ed60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2ed70 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
2ed80 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2ed90 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2eda0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2edb0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2edc0 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2edd0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ede0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2edf0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2ee00 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2ee10 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75  lidOvfl);.  retu
2ee20 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2ee30 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2ee40 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2ee50 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2ee60 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2ee70 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2ee80 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2ee90 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2eea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2eeb0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2eec0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2eed0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2eee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2eef0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2ef00 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2ef10 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2ef20 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2ef30 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2ef40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2ef50 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2ef60 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2ef70 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2ef80 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2ef90 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2efa0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2efb0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2efc0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2efd0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2efe0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2eff0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2f000 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2f010 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2f020 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2f030 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2f040 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2f050 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2f060 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2f070 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2f080 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2f090 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2f0a0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2f0b0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2f0c0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2f0d0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2f0e0 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2f0f0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2f100 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2f110 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2f120 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2f130 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2f140 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2f150 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2f160 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2f170 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2f180 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2f190 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2f1a0 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2f1b0 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2f1c0 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2f1d0 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2f1e0 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2f1f0 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2f200 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2f210 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2f220 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2f230 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2f240 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2f250 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2f260 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2f270 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2f280 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2f290 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2f2a0 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2f2b0 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2f2c0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2f2d0 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2f2e0 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2f2f0 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2f300 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2f310 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2f320 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2f330 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2f340 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2f350 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2f360 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2f370 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2f380 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2f390 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2f3a0 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2f3b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2f3c0 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2f3d0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2f3e0 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2f3f0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2f400 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2f410 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2f420 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2f430 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2f440 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2f450 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2f460 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2f470 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2f480 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2f490 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2f4a0 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2f4b0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2f4c0 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2f4d0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2f4e0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2f4f0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2f500 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2f510 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2f520 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2f530 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2f540 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2f550 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2f560 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f570 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2f580 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2f590 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2f5a0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2f5b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
2f5c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2f5d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2f5e0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  =0 );.    rc = r
2f5f0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2f600 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2f610 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f620 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2f630 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2f640 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2f650 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2f660 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2f670 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2f680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f690 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2f6a0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2f6b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2f6c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f6d0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2f6e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2f6f0 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2f700 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f710 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2f720 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2f730 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pNext>0 ){.     
2f740 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2f750 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2f760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2f780 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2f790 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2f7a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2f7b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2f7c0 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
2f7d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2f7e0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2f7f0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2f800 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
2f810 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2f820 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
2f830 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
2f840 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
2f850 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
2f860 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
2f870 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
2f880 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
2f890 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
2f8a0 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
2f8b0 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
2f8c0 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
2f8d0 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
2f8e0 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
2f8f0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2f900 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
2f910 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
2f920 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
2f930 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
2f940 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
2f950 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
2f960 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
2f970 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28  >nCell );..  if(
2f980 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
2f990 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
2f9a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f9b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2f9c0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2f9d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2f9e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2f9f0 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
2fa00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2fa10 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
2fa20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2fa30 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2fa40 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
2fa50 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2fa60 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2fa70 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
2fa80 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2fa90 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2faa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fab0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2fac0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2fad0 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2fae0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2faf0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2fb00 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2fb10 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2fb20 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
2fb30 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
2fb40 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2fb50 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2fb60 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2fb70 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2fb80 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2fb90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2fba0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
2fbb0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2fbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2fbd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2fbe0 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2fbf0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2fc00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2fc10 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2fc20 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2fc30 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2fc40 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
2fc50 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2fc60 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2fc70 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2fc80 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2fc90 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2fca0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2fcb0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2fcc0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2fcd0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2fce0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2fcf0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2fd00 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2fd10 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2fd20 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65  lidOvfl);.  *pRe
2fd30 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  s = 0;.  if( pCu
2fd40 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2fd50 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2fd60 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2fd70 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20   pRes);.  pPage 
2fd80 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2fd90 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2fda0 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64  f( (++pCur->aiId
2fdb0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e  x[pCur->iPage])>
2fdc0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2fdd0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2fde0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2fdf0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2fe00 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2fe10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2fe20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2fe30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fe40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2fe50 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2fe60 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2fe70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2fe80 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2fe90 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2fea0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2feb0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2fec0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2fed0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2fee0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2fef0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2ff00 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
2ff10 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2ff20 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2ff30 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2ff40 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2ff50 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2ff60 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2ff70 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2ff80 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2ff90 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
2ffa0 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2ffb0 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2ffc0 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2ffd0 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
2ffe0 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2fff0 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
30000 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
30010 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
30020 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
30030 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
30040 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
30050 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
30060 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
30070 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
30080 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
30090 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
300a0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
300b0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
300c0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
300d0 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
300e0 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
300f0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
30100 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
30110 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
30120 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
30130 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
30140 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
30150 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
30160 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
30170 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
30180 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
30190 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
301a0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
301b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
301c0 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
301d0 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
301e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
301f0 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
30200 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
30210 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
30220 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
30230 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
30240 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
30250 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
30260 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
30270 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
30280 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
30290 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
302a0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
302b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
302c0 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
302d0 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
302e0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
302f0 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50  NLINE int btreeP
30300 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
30310 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
30320 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
30330 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
30340 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
30350 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
30360 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30370 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
30380 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
30390 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
303a0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
303b0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
303c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
303d0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
303e0 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
303f0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
30400 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
30410 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
30420 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
30430 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
30440 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
30450 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
30460 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
30470 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
30480 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
30490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
304a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
304b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
304c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
304d0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
304e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
304f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30500 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
30510 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
30520 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
30530 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
30540 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
30550 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
30560 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
30570 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
30580 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
30590 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
305a0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
305b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
305c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
305d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
305e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
305f0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
30600 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
30610 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
30620 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
30630 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
30640 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
30650 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
30660 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
30670 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
30680 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
30690 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
306a0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
306b0 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
306c0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
306d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
306e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
306f0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
30700 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
30710 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
30720 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
30730 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
30740 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
30750 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
30760 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
30770 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
30780 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
30790 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
307a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
307b0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
307c0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
307d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
307e0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
307f0 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
30800 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
30810 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
30820 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
30830 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
30840 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
30850 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
30860 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
30870 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
30880 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
30890 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
308a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
308b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
308c0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
308d0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
308e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
308f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30900 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
30910 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
30920 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
30930 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30940 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73  nt *pRes){.  ass
30950 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
30960 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
30970 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
30980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
30990 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
309a0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
309b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
309c0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
309d0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
309e0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
309f0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
30a00 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
30a10 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
30a20 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
30a30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
30a40 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
30a50 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
30a60 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
30a70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
30a80 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
30a90 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
30aa0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
30ab0 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
30ac0 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
30ad0 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
30ae0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
30af0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
30b00 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
30b10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
30b20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
30b30 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
30b40 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
30b50 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
30b60 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
30b70 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
30b80 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
30b90 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
30ba0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
30bb0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
30bc0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
30bd0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
30be0 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
30bf0 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
30c00 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
30c10 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
30c20 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
30c30 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
30c40 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
30c50 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
30c60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
30c70 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
30c80 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
30c90 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
30ca0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
30cb0 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  .  *ppPage is se
30cc0 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65  t to NULL in the
30cd0 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
30ce0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
30cf0 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
30d00 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
30d10 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
30d20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
30d30 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
30d40 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
30d50 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
30d60 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
30d70 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
30d80 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
30d90 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
30da0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
30db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
30dc0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
30dd0 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
30de0 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
30df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
30e00 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
30e10 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
30e20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
30e30 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
30e40 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
30e50 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
30e60 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
30e70 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
30e80 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
30e90 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
30ea0 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
30eb0 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
30ec0 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
30ed0 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
30ee0 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
30ef0 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
30f00 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
30f10 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
30f20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
30f30 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
30f40 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
30f50 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
30f60 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
30f70 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
30f80 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
30f90 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
30fa0 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
30fb0 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
30fc0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
30fd0 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
30fe0 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
30ff0 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
31000 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
31010 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
31020 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
31030 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
31040 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
31050 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
31060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
31070 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
31080 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
31090 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
310a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
310b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
310c0 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
310d0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
310e0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
310f0 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
31100 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
31110 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
31120 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
31130 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
31140 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
31150 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
31160 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
31170 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
31180 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
31190 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
311a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
311b0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
311c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
311d0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
311e0 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
311f0 30 20 26 26 20 52 45 51 55 49 52 45 5f 50 54 52  0 && REQUIRE_PTR
31200 4d 41 50 20 29 20 29 3b 0a 20 20 70 50 61 67 65  MAP ) );.  pPage
31210 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
31220 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
31230 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
31240 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
31250 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
31260 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
31270 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
31280 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
31290 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
312a0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
312b0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
312c0 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
312d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
312e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
312f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
31300 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
31310 28 20 49 53 55 4e 4c 4f 43 4b 45 44 3d 3d 30 20  ( ISUNLOCKED==0 
31320 26 26 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  && n>=mxPage ){.
31330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31340 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
31350 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65    }..  /* Ensure
31360 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 61   page 1 is writa
31370 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
31380 6f 6e 20 77 69 6c 6c 20 65 69 74 68 65 72 20 63  on will either c
31390 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72  hange the number
313a0 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 73 20 69  .  ** of pages i
313b0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
313c0 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
313d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
313e0 2e 20 53 69 6e 63 65 20 62 6f 74 68 0a 20 20 2a  . Since both.  *
313f0 2a 20 6f 66 20 74 68 65 73 65 20 6f 70 65 72 61  * of these opera
31400 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d 6f  tions involve mo
31410 64 69 66 79 69 6e 67 20 70 61 67 65 20 31 20 68  difying page 1 h
31420 65 61 64 65 72 20 66 69 65 6c 64 73 2c 20 70 61  eader fields, pa
31430 67 65 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20 64  ge 1.  ** will d
31440 65 66 69 6e 69 74 65 6c 79 20 62 65 20 77 72 69  efinitely be wri
31450 74 74 65 6e 20 62 79 20 74 68 69 73 20 74 72 61  tten by this tra
31460 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  nsaction. If thi
31470 73 20 69 73 20 61 6e 20 55 4e 4c 4f 43 4b 45 44  s is an UNLOCKED
31480 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
31490 6e 2c 20 65 6e 73 75 72 65 20 74 68 65 20 42 74  n, ensure the Bt
314a0 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74  reePtrmap struct
314b0 75 72 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ure has been all
314c0 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 72 63  ocated.  */.  rc
314d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
314e0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
314f0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
31500 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
31510 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
31520 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
31530 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
31540 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
31550 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
31560 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
31570 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
31580 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
31590 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
315a0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
315b0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
315c0 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
315d0 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
315e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
315f0 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
31600 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
31610 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31620 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
31630 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
31640 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
31650 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
31660 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
31670 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
31680 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
31690 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
316a0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
316b0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
316c0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
316d0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
316e0 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
316f0 20 61 73 73 65 72 74 28 20 49 53 41 55 54 4f 56   assert( ISAUTOV
31700 41 43 55 55 4d 21 3d 49 53 55 4e 4c 4f 43 4b 45  ACUUM!=ISUNLOCKE
31710 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  D );.      if( I
31720 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31730 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
31740 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
31750 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
31760 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31770 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
31780 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31790 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
317a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
317b0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
317c0 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
317d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
317e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
317f0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rc;.          if
31800 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
31810 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
31820 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
31830 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
31840 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31860 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
31870 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
31880 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
31890 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
318a0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
318b0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
318c0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
318d0 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
318e0 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
318f0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
31900 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
31910 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
31920 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
31930 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
31940 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  1..    */.    pu
31950 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31960 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
31970 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
31980 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
31990 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
319a0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
319b0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
319c0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
319d0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
319e0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
319f0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
31a00 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
31a10 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
31a20 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
31a30 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
31a40 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31a50 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
31a60 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
31a70 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
31a80 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
31a90 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
31aa0 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
31ab0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
31ac0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
31ad0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
31ae0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
31af0 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
31b00 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
31b10 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
31b20 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
31b30 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
31b40 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
31b50 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
31b60 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
31b70 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
31b80 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
31b90 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
31ba0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31bb0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
31bc0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
31bd0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
31be0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
31bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31c00 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
31c10 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
31c20 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
31c30 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
31c40 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
31c50 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
31c60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
31c70 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
31c80 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
31c90 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
31ca0 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
31cb0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
31cc0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
31cd0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
31ce0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
31cf0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
31d00 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
31d10 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
31d20 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
31d30 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
31d40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31d50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31d60 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
31d70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
31d80 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
31d90 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
31da0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
31db0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
31dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
31dd0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
31de0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31df0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
31e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
31e10 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
31e20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
31e30 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
31e40 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
31e50 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
31e60 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
31e70 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
31e80 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
31e90 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
31ea0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
31eb0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
31ec0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
31ed0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
31ee0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
31ef0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
31f00 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
31f10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
31f20 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
31f30 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
31f40 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
31f50 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
31f60 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
31f70 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
31f80 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
31f90 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
31fa0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
31fb0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
31fc0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
31fd0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
31fe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31ff0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
32000 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32010 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32020 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32030 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32050 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
32060 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
32070 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
32080 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
32090 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
320a0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
320b0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
320c0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
320d0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
320e0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
320f0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
32100 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
32110 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
32120 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
32130 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
32140 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
32150 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
32160 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
32170 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
32180 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
32190 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
321a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
321b0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
321c0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
321d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
321e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
321f0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
32200 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
32210 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
32220 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
32230 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
32240 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
32250 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
32260 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
32270 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
32280 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
32290 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
322a0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
322b0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
322c0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
322d0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
322e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
322f0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
32300 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
32310 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
32320 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
32330 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32340 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32350 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32360 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32370 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
32380 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32390 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
323a0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
323b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
323c0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
323d0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
323e0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
323f0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
32400 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
32410 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32420 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32430 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32440 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
32450 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32480 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32490 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
324a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
324b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
324c0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
324d0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
324e0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
324f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32510 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
32520 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
32530 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
32540 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
32550 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
32560 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
32570 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
32580 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
32590 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
325a0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
325b0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
325c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
325d0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
325e0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
325f0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
32600 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
32610 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
32620 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
32630 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
32640 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32650 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
32660 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
32670 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32680 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
326a0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
326b0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
326c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
326d0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
326e0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
326f0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
32700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32720 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32730 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32740 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
32750 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32760 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32770 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
32780 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
32790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
327a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
327b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
327c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
327d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
327e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
327f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32800 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
32810 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
32820 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
32830 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
32840 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
32850 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
32860 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
32870 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
32880 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
32890 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
328a0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
328b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
328c0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
328d0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
328e0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
328f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
32900 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
32910 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
32920 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
32930 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
32940 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32950 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
32960 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32970 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32980 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32990 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
329a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
329b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
329c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
329d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
329e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
329f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
32a00 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
32a10 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
32a20 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
32a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
32a40 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
32a50 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
32a60 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
32a70 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
32a80 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
32a90 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
32aa0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
32ab0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
32ac0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
32ad0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
32ae0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
32af0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
32b00 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
32b10 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
32b20 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
32b30 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
32b40 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
32b50 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
32b60 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
32b70 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
32b80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
32b90 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
32ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
32bb0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
32bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32bd0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
32be0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
32bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32c00 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
32c10 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
32c20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
32c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32c40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
32c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32c80 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
32c90 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
32ca0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
32cb0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
32cc0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
32cd0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
32ce0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
32cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
32d00 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
32d10 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
32d20 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
32d30 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
32d40 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
32d50 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
32d60 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
32d70 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
32d80 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
32d90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
32da0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32dd0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
32de0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
32df0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
32e00 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
32e10 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
32e20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
32e30 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
32e40 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
32e50 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
32e60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
32e70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32e80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32e90 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32eb0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
32ec0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32ed0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
32ee0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
32ef0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
32f00 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
32f10 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
32f20 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
32f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
32f40 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
32f50 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
32f60 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
32f70 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32f80 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
32f90 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
32fa0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
32fb0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
32fc0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
32fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fe0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
32ff0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
33000 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
33010 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33020 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
33030 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
33040 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
33050 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
33060 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
33070 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
33080 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
33090 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
330a0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
330b0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
330c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
330d0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
330e0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
330f0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
33100 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
33110 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
33120 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
33130 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
33140 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
33150 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
33160 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
33170 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
33180 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
33190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
331a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
331b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
331c0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
331d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
331e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
331f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33200 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
33210 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
33220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
33230 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
33240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
33260 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
33270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33280 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
33290 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
332a0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
332b0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
332c0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
332d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
332e0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
332f0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
33300 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
33310 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
33320 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33330 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
33340 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
33350 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
33360 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
33370 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
33380 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
33390 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
333a0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
333b0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
333c0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
333d0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
333e0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
333f0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
33400 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
33410 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
33420 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
33430 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
33440 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
33450 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
33460 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
33470 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
33480 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
33490 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
334a0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
334b0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
334c0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
334d0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
334e0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
334f0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
33500 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
33510 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
33520 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
33530 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
33540 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
33550 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
33560 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
33570 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
33580 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
33590 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
335a0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
335b0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
335c0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
335d0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
335e0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
335f0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
33600 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
33610 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
33620 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
33630 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
33640 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
33650 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
33660 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
33670 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
33680 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
33690 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
336a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
336b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
336c0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
336d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
336e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
336f0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
33700 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
33710 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
33720 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
33730 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
33740 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33750 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
33760 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
33770 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
33790 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
337a0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
337b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
337c0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
337d0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
337e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
337f0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
33800 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33810 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
33820 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
33830 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
33840 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
33850 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
33860 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
33870 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
33880 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
33890 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
338a0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
338b0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
338c0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
338d0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
338e0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
338f0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
33900 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
33910 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
33920 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
33930 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
33940 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
33950 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
33960 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
33970 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
33980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33990 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
339a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
339b0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
339c0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
339d0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
339e0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
339f0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
33a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33a10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
33a20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33a30 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
33a40 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
33a50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
33a60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
33a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33a80 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
33a90 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
33aa0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
33ab0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
33ac0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
33ad0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33ae0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
33af0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
33b00 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
33b10 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
33b20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
33b30 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
33b40 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
33b50 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
33b60 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
33b70 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
33b80 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
33b90 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
33ba0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33bb0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
33bc0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
33bd0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
33be0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
33bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33c00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
33c10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
33c20 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
33c30 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
33c40 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
33c50 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
33c60 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
33c70 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
33c80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33c90 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
33ca0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
33cb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
33cc0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
33cd0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
33ce0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
33cf0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
33d00 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33d10 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
33d20 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
33d30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33d40 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
33d50 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
33d60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33d70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
33d80 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
33d90 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
33da0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33db0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
33dc0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
33dd0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
33de0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
33df0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
33e00 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
33e10 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
33e20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
33e30 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
33e40 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
33e50 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
33e60 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
33e70 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
33e80 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
33e90 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
33ea0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
33eb0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
33ec0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
33ed0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
33ee0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
33ef0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
33f00 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
33f10 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
33f20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
33f30 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
33f40 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
33f50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
33f60 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
33f70 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
33f80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
33f90 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
33fa0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
33fb0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
33fc0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
33fd0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
33fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33ff0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
34000 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
34010 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
34020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34030 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
34040 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
34050 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
34060 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
34070 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
34080 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
34090 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
340a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
340b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
340c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
340d0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
340e0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
340f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
34100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34110 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
34120 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
34130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34140 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
34150 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
34160 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
34170 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
34180 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34190 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
341a0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
341b0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
341c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
341d0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
341e0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
341f0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
34200 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
34210 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34220 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
34230 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
34240 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
34250 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
34260 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
34270 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
34280 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
34290 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
342a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
342b0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
342c0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
342d0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
342e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
342f0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
34300 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34310 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34320 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
34330 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34340 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
34350 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34360 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
34370 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
34380 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
34390 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
343a0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
343b0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
343c0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
343d0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
343e0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
343f0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
34400 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
34410 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
34420 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
34430 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
34440 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
34450 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
34460 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
34470 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34480 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
34490 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
344a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
344b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
344c0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
344d0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
344e0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
344f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
34500 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34510 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34520 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
34530 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
34540 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
34550 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
34560 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
34570 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52 45 5f  /.  if( REQUIRE_
34580 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20 70 74  PTRMAP ){.    pt
34590 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
345a0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
345b0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
345c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
345d0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
345e0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
345f0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
34600 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
34610 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
34620 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
34630 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
34640 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
34650 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
34660 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
34670 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
34680 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
34690 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
346a0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
346b0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
346c0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
346d0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
346e0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
346f0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
34700 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
34710 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
34720 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
34730 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
34740 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
34750 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
34760 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
34770 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
34780 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
34790 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
347a0 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
347b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
347c0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
347d0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
347e0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
347f0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
34800 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
34810 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
34820 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
34830 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
34840 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
34850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34860 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34870 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34880 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
34890 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
348a0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
348b0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
348c0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
348d0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
348e0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
348f0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
34900 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34910 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
34920 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34930 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
34940 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
34950 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
34960 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
34970 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34980 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
34990 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
349a0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
349b0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
349c0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
349d0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
349e0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
349f0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
34a00 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
34a10 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
34a20 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
34a30 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
34a40 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
34a50 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
34a60 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
34a70 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
34a80 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
34a90 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
34aa0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
34ab0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
34ac0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
34ad0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
34ae0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
34af0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
34b00 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
34b10 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
34b20 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
34b30 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
34b40 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
34b50 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
34b60 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
34b70 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
34b80 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
34b90 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
34ba0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
34bb0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
34bc0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
34bd0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
34be0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
34bf0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
34c00 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
34c10 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
34c20 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
34c30 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
34c40 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
34c50 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
34c60 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
34c70 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
34c80 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
34c90 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
34ca0 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
34cb0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
34cc0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
34cd0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
34ce0 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
34cf0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
34d00 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
34d10 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
34d20 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
34d30 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
34d40 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
34d50 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
34d60 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
34d70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
34d80 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
34d90 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34da0 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
34db0 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
34dc0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
34dd0 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
34de0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34df0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
34e00 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
34e10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34e30 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
34e40 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
34e50 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
34e60 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
34e70 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
34e80 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
34e90 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
34ea0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
34eb0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
34ec0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
34ed0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34ee0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
34ef0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
34f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
34f10 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
34f20 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
34f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34f40 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
34f50 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
34f60 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
34f70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
34f80 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
34f90 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34fa0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
34fb0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
34fc0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
34fd0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
34fe0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
34ff0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
35000 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
35010 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
35020 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
35030 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
35040 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
35050 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
35060 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
35070 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
35080 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
35090 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
350a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
350b0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
350c0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
350d0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
350e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
350f0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
35100 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
35110 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
35120 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
35130 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
35140 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
35150 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
35160 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
35170 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
35180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35190 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
351a0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
351b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
351c0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
351d0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
351e0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
351f0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
35200 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
35210 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
35220 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
35230 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
35240 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
35250 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
35260 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
35270 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
35280 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
35290 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
352a0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
352b0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
352c0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
352d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
352e0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
352f0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
35300 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
35310 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
35320 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
35330 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
35340 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
35350 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
35360 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
35370 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
35380 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
35390 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
353a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
353b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
353c0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
353d0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
353e0 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
353f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
35400 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
35410 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
35420 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
35430 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
35440 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
35450 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
35460 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
35470 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
35480 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
35490 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
354a0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
354b0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
354c0 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
354d0 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
354e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
354f0 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
35500 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
35510 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
35520 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
35530 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
35540 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
35550 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
35560 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
35570 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
35580 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35590 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
355a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
355b0 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
355c0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
355d0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
355e0 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
355f0 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
35600 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
35610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35620 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
35630 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
35640 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
35650 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
35660 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
35670 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
35680 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
35690 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
356a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
356b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
356c0 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
356d0 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
356e0 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
356f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
35700 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
35710 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
35720 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
35730 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
35740 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
35750 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
35760 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
35770 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
35780 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
35790 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
357a0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
357b0 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
357c0 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
357d0 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
357e0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
357f0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
35800 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
35810 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
35820 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
35830 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
35840 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
35850 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
35860 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
35870 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
35880 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
35890 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
358a0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
358b0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
358c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
358d0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
358e0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
358f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
35900 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
35910 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
35920 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
35930 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35940 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35950 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
35960 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
35970 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
35980 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
35990 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
359a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
359b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
359c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
359d0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
359e0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
359f0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
35a00 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
35a10 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
35a20 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
35a30 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
35a40 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
35a50 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
35a60 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
35a70 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
35a80 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
35a90 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
35aa0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
35ab0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
35ac0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
35ad0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
35ae0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
35af0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
35b00 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
35b10 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
35b20 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
35b30 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
35b40 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
35b50 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
35b60 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
35b70 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
35b80 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
35b90 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
35ba0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
35bb0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
35bc0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
35bd0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
35be0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
35bf0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
35c00 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
35c10 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
35c20 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
35c30 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
35c40 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
35c50 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
35c60 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
35c70 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
35c80 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
35c90 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
35ca0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
35cb0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
35cc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
35cd0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
35ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
35cf0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
35d00 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
35d10 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
35d20 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
35d30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35d40 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
35d50 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
35d60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35d70 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
35d80 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
35d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
35db0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
35dc0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
35dd0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
35de0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
35df0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
35e00 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
35e10 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
35e20 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
35e30 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
35e40 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
35e50 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
35e60 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
35e70 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
35e80 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
35e90 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
35ea0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
35eb0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
35ec0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
35ed0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
35ee0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
35ef0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
35f00 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
35f10 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
35f20 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
35f30 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
35f40 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
35f50 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
35f60 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
35f70 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
35f80 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
35f90 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
35fa0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
35fb0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
35fc0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
35fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35fe0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
35ff0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
36000 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
36010 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
36020 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
36030 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
36040 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
36050 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
36060 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
36070 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
36080 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
36090 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
360a0 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
360b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
360c0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
360d0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
360e0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
360f0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
36100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36110 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
36120 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
36130 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
36140 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
36150 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
36160 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
36170 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
36180 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
36190 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
361a0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
361b0 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
361c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
361d0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
361e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
361f0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
36200 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
36210 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
36220 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
36230 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
36240 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
36250 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
36260 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
36270 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
36280 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
36290 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
362a0 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
362b0 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
362c0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
362d0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
362e0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
362f0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
36300 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
36310 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
36320 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
36330 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36340 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
36350 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
36360 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
36370 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
36380 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
36390 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
363a0 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
363b0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
363c0 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
363d0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
363e0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
363f0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
36400 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36410 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
36420 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36430 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
36440 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
36450 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
36460 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
36470 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
36480 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
36490 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
364a0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
364b0 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
364c0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
364d0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
364e0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
364f0 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c     assert( nKey<
36500 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
36510 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50  Key!=0 );.    nP
36520 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
36530 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
36540 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
36550 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
36560 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
36570 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
36580 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
36590 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
365a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
365b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
365c0 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
365d0 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
365e0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
365f0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
36600 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
36610 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
36620 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
36630 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
36640 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
36650 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
36660 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
36670 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
36680 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36690 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
366a0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
366b0 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
366c0 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
366d0 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
366e0 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
366f0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
36700 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
36710 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
36720 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
36730 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
36740 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
36750 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
36760 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
36770 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
36780 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
36790 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
367a0 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
367b0 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
367c0 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
367d0 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
367e0 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
367f0 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
36800 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
36810 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
36820 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
36830 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
36840 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
36850 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
36860 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36870 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
36880 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
36890 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
368a0 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
368b0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
368c0 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
368d0 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
368e0 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
368f0 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
36900 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
36910 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
36920 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
36930 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
36940 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
36950 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
36960 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
36970 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
36980 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
36990 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
369a0 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
369b0 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
369c0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
369d0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
369e0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
369f0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
36a00 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
36a10 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e  ert( nHeader=(in
36a20 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
36a30 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
36a40 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
36a50 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
36a60 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
36a70 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
36a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
36a90 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
36aa0 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  Local );.    ass
36ab0 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26  ert( pPrior == &
36ac0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
36ad0 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e  flow] );.  }.#en
36ae0 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
36af0 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
36b00 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
36b10 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
36b20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
36b30 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
36b40 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
36b50 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
36b60 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
36b70 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36b80 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
36b90 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
36ba0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
36bb0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
36bc0 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
36bd0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
36be0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
36bf0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
36c00 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
36c10 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
36c20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
36c30 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
36c40 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
36c50 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
36c60 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
36c70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
36c80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
36c90 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
36ca0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
36cb0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
36cc0 4f 76 66 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 20  Ovfl, 0);..     
36cd0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
36ce0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
36cf0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
36d00 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
36d10 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
36d20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
36d30 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
36d40 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
36d50 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
36d60 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
36d70 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
36d80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
36d90 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
36da0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
36db0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
36dc0 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
36dd0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
36de0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
36df0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
36e00 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
36e10 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
36e20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
36e30 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
36e40 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
36e50 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
36e60 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
36e70 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
36e80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
36e90 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
36ea0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
36eb0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
36ec0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
36ed0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 52    */.      if( R
36ee0 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20 26 26  EQUIRE_PTRMAP &&
36ef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36f00 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
36f10 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
36f20 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
36f30 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
36f40 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
36f50 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
36f60 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
36f70 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
36f80 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
36f90 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
36fa0 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
36fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36fc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
36fd0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
36fe0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
36ff0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
37000 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
37010 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
37020 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
37030 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
37040 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
37050 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
37060 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
37070 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
37080 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
37090 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
370a0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
370b0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
370c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
370d0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
370e0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
370f0 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
37100 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
37110 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
37120 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
37130 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
37140 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
37150 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
37160 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
37170 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
37180 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
37190 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
371a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
371b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
371c0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
371d0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
371e0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
371f0 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
37200 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37210 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
37220 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
37230 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
37240 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
37250 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
37260 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
37270 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
37280 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
37290 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
372a0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
372b0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
372c0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
372d0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
372e0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
372f0 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
37300 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
37310 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
37320 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
37330 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
37340 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
37350 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
37360 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
37370 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
37380 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
37390 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
373a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
373b0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
373c0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
373d0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
373e0 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
373f0 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
37400 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
37410 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
37420 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
37430 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
37440 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
37450 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
37460 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
37470 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
37480 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
37490 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
374a0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
374b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
374c0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
374d0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
374e0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
374f0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
37500 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
37510 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
37520 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
37530 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
37540 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
37550 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
37560 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
37570 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
37580 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
37590 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
375a0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
375b0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
375c0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
375d0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
375e0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
375f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
37600 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
37610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37620 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
37630 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
37640 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
37650 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
37660 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
37670 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
37680 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
37690 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
376a0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
376b0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
376c0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
376d0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
376e0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
376f0 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
37700 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
37710 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
37720 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
37730 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
37740 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
37750 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
37760 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
37770 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
37780 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
37790 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
377a0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
377b0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
377c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
377d0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
377e0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
377f0 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
37800 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
37810 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
37820 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
37830 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
37840 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
37850 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
37860 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
37870 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
37880 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
37890 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
378a0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
378b0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
378c0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
378d0 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
378e0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
378f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
37900 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37910 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
37920 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
37930 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37940 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37950 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37960 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
37970 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37980 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
37990 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
379a0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
379b0 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
379c0 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
379d0 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
379e0 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
379f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
37a00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
37a10 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
37a20 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
37a30 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
37a40 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
37a50 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
37a60 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
37a70 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
37a80 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
37a90 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37aa0 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
37ab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37ac0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
37ad0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
37ae0 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
37af0 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
37b00 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
37b10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
37b20 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
37b30 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
37b40 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
37b50 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
37b60 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
37b70 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
37b80 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
37b90 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
37ba0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
37bb0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
37bc0 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
37bd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
37be0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
37bf0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
37c00 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
37c10 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
37c20 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
37c30 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
37c40 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
37c50 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
37c60 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
37c70 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
37c80 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
37c90 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
37ca0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
37cb0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
37cc0 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
37cd0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
37ce0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
37cf0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
37d00 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
37d10 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37d20 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
37d30 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
37d40 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
37d50 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
37d60 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
37d70 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
37d80 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
37d90 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
37da0 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
37db0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
37dc0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
37dd0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
37de0 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
37df0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
37e00 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
37e10 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
37e20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
37e30 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
37e40 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
37e50 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
37e60 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
37e70 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
37e80 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
37e90 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
37ea0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
37eb0 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ented..*/.static
37ec0 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
37ed0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
37ee0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
37ef0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
37f00 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
37f10 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
37f20 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
37f30 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
37f40 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
37f50 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
37f60 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
37f70 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
37f80 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
37f90 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
37fa0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
37fb0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
37fc0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
37fd0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
37fe0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
37ff0 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
38000 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
38010 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
38020 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
38030 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
38040 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
38050 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
38060 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
38070 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
38080 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
38090 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
380a0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
380b0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
380c0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
380d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
380e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
380f0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
38100 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
38110 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
38120 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
38130 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIns;         /*
38140 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50   The point in pP
38150 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20  age->aCellIdx[] 
38160 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e  where no cell in
38170 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28  serted */..  if(
38180 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
38190 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
381a0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
381b0 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
381c0 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
381d0 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
381e0 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
381f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
38200 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
38210 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
38220 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
38230 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
38240 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
38250 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
38260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
38270 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
38280 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
38290 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
382a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
382b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
382c0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
382d0 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
382e0 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
382f0 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
38300 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
38310 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
38320 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
38330 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
38340 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
38350 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
38360 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
38370 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
38380 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
38390 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
383a0 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
383b0 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
383c0 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
383d0 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
383e0 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
383f0 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
38400 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
38410 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
38420 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
38430 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
38440 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61   assert( sz==pPa
38450 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
38460 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
38470 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
38480 30 29 20 29 3b